<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ruseer</id>
	<title>Svacer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ruseer"/>
	<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Special:Contributions/Ruseer"/>
	<updated>2026-04-14T08:33:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3464</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3464"/>
		<updated>2026-02-09T11:30:13Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Release 12-0-1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-1 ===&lt;br /&gt;
&lt;br /&gt;
* Убраны ограничения на размер поля advanced filter в пользовательских фильтрах&lt;br /&gt;
* В публичных запросах возвращающих маркеры добавлено поле &amp;lt;code&amp;gt;checker_situation&amp;lt;/code&amp;gt; соответствующее полю `situation` в детекторах&lt;br /&gt;
* Добавлена возможность фильтрации по &amp;lt;code&amp;gt;checker_situation&amp;lt;/code&amp;gt; в advanced filter&lt;br /&gt;
* Добавлена возможность фильтрации по &amp;lt;code&amp;gt;checker_labels&amp;lt;/code&amp;gt; в advanced filter. Поле содержит массив текстовых меток. В настоящий момент используется для пометки детекторов соответствующих  &amp;lt;code&amp;gt;ГОСТ 71207-2024&amp;lt;/code&amp;gt; &lt;br /&gt;
* Добавлен публичный фильтр по детекторам, соответствующим &amp;lt;code&amp;gt;ГОСТ 71207-2024&amp;lt;/code&amp;gt; . Импортировано описание детекторов из &amp;lt;code&amp;gt;Svace version 5.0.251220&amp;lt;/code&amp;gt;&lt;br /&gt;
* При миграции со старых версий баз (а так же при миграциях, связанных с  изменением схемы генерации инвариантов) реализовано полное сохранение разметки и комментариев на маркерах и последующее восстановление пропущенных, после миграций, разметок и комментариев (при обнаружении таковых)&lt;br /&gt;
* Вынесен ряд timeout-ов на уровень переменных окружения для адаптации под пользовательские сценарии&lt;br /&gt;
* Добавлена подсветка синтаксиса для языка Lua&lt;br /&gt;
* Исправлены проблемы безопасности, связанные с импортом данных и механизмом токенов доступа (PAT)&lt;br /&gt;
* При загрузке снимков, svace-dir и разметки через командную строку появилась возможность указать флаг &amp;lt;code&amp;gt;retry-policy&amp;lt;/code&amp;gt;, который задает время ожидания ответа от сервера, количество дополнительных попыток и задержка между повторами, например &amp;lt;code&amp;gt;30m:10:1m&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Release 12-0-0 ===&lt;br /&gt;
28.11.2025&lt;br /&gt;
&lt;br /&gt;
* API методы на fullmarkers позволяют [[Help:Public API#Примеры использования фильтров в public api|указать фильтр]] с полем фильтрации по checker reliability&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров по id и инварианту&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления. Это должно снизить использование памяти при импорте&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; для [[Help:Configuration#Переменные окружения|контроля таймаута]] на ожидание начала импорта результатов и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; на [[Help:Configuration#Переменные окружения|ограничение числа параллельных импортов]]. По умолчанию значения 15 минут и &amp;lt;code&amp;gt;(максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничения необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В метрики Prometheus добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера, показываемого в Web-интерфейсе, ограничен. Размер [[Help:Configuration#Переменные окружения|задается переменной окружения]] SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл не ограничивается в размерах и кнопка выгрузки лога выгружает полный лог&lt;br /&gt;
* ['''Экспериментально'''] Можно [[Help:Configuration#Переменные окружения|указать JSON-формат]] лог-файла посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, также формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции также работают для CLI-клиента svacer&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов. Это может решить проблему с переносом разметки&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных заданий при регенерации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена возможность создания [[Afilters|сложных пользовательских фильтров]] по условиям, выраженным предикатом &lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant#Активация и запуск ИИ-ассистента|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* ['''Экспериментально'''] Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции &amp;lt;code&amp;gt;quick-stat&amp;lt;/code&amp;gt;. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграция с внешними системами посредством механизма [[Help:Configuration#Механизм интеграции с внешними системами посредством Webhook-ов|Webhooks]]&lt;br /&gt;
* Добавлена [[Help:Configuration#Настройка защиты от перебора паролей пользователей|защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Configuration#Настройка парольной политики внутреннего механизма аутентификации Svacer|парольную политику безопасности]] для пользователей, использующих встроенный механизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Configuration#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутреннего механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
* Форма [[Help:UI manual#Разметка маркера с помощью ассистента AI|разметки]] с помощью [[Help:XSvacer:AIAssistant|ИИ-ассистента]] реализована в основном интерфейсе Svacer&lt;br /&gt;
* [[Help:XSvacer:Webide#Запуск функциональности при использовании docker compose|Упрощён запуск функциональности Webide]] при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#deb/rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3461</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3461"/>
		<updated>2026-02-09T04:36:50Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Changelog 12-0-1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-1 ===&lt;br /&gt;
&lt;br /&gt;
* Убраны ограничения на размер поля advanced filter в пользовательских фильтрах&lt;br /&gt;
* В публичных запросах возвращающих маркеры добавлено поле &amp;lt;code&amp;gt;checker_situation&amp;lt;/code&amp;gt; соответствующее полю `situation` в детекторах&lt;br /&gt;
* Добавлена возможность фильтрации по &amp;lt;code&amp;gt;checker_situation&amp;lt;/code&amp;gt; в advanced filter&lt;br /&gt;
* Добавлена возможность фильтрации по &amp;lt;code&amp;gt;checker_labels&amp;lt;/code&amp;gt; в advanced filter&lt;br /&gt;
* Добавлен публичный фильтр по детекторам, соответствующим &amp;lt;code&amp;gt;ГОСТ 71207-2024&amp;lt;/code&amp;gt; . Импортировано описание детекторов из &amp;lt;code&amp;gt;Svace version 5.0.251220&amp;lt;/code&amp;gt;&lt;br /&gt;
* При миграции со старых версий баз (а так же при миграциях, связанных с  изменением схемы генерации инвариантов) реализовано полное сохранение разметки и комментариев на маркерах и последующее восстановление пропущенных, после миграций, разметок и комментариев (при обнаружении таковых)&lt;br /&gt;
* Вынесен ряд timeout-ов на уровень переменных окружения для адаптации под пользовательские сценарии&lt;br /&gt;
* Добавлена подсветка синтаксиса для языка Lua&lt;br /&gt;
&lt;br /&gt;
=== Release 12-0-0 ===&lt;br /&gt;
28.11.2025&lt;br /&gt;
&lt;br /&gt;
* API методы на fullmarkers позволяют [[Help:Public API#Примеры использования фильтров в public api|указать фильтр]] с полем фильтрации по checker reliability&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров по id и инварианту&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления. Это должно снизить использование памяти при импорте&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; для [[Help:Configuration#Переменные окружения|контроля таймаута]] на ожидание начала импорта результатов и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; на [[Help:Configuration#Переменные окружения|ограничение числа параллельных импортов]]. По умолчанию значения 15 минут и &amp;lt;code&amp;gt;(максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничения необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В метрики Prometheus добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера, показываемого в Web-интерфейсе, ограничен. Размер [[Help:Configuration#Переменные окружения|задается переменной окружения]] SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл не ограничивается в размерах и кнопка выгрузки лога выгружает полный лог&lt;br /&gt;
* ['''Экспериментально'''] Можно [[Help:Configuration#Переменные окружения|указать JSON-формат]] лог-файла посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, также формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции также работают для CLI-клиента svacer&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов. Это может решить проблему с переносом разметки&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных заданий при регенерации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена возможность создания [[Afilters|сложных пользовательских фильтров]] по условиям, выраженным предикатом &lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant#Активация и запуск ИИ-ассистента|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* ['''Экспериментально'''] Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции &amp;lt;code&amp;gt;quick-stat&amp;lt;/code&amp;gt;. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграция с внешними системами посредством механизма [[Help:Configuration#Механизм интеграции с внешними системами посредством Webhook-ов|Webhooks]]&lt;br /&gt;
* Добавлена [[Help:Configuration#Настройка защиты от перебора паролей пользователей|защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Configuration#Настройка парольной политики внутреннего механизма аутентификации Svacer|парольную политику безопасности]] для пользователей, использующих встроенный механизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Configuration#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутреннего механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
* Форма [[Help:UI manual#Разметка маркера с помощью ассистента AI|разметки]] с помощью [[Help:XSvacer:AIAssistant|ИИ-ассистента]] реализована в основном интерфейсе Svacer&lt;br /&gt;
* [[Help:XSvacer:Webide#Запуск функциональности при использовании docker compose|Упрощён запуск функциональности Webide]] при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#deb/rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3460</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3460"/>
		<updated>2026-02-02T04:40:41Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2026-01-31@12:55:50.2b2780cd&lt;br /&gt;
|&lt;br /&gt;
* Улучшен механизм работы save/restore при миграции разметки&lt;br /&gt;
|-&lt;br /&gt;
|devel.2026-01-13@11:09:25.33b8eabd&lt;br /&gt;
|&lt;br /&gt;
* Добвлен флаг &amp;lt;code&amp;gt;--merge&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;reviewer migrate save&amp;lt;/code&amp;gt; для обновление созданного бэкапа разметки&lt;br /&gt;
* Исправлен пропуск комментариев при команде &amp;lt;code&amp;gt;reviewer migrate restore&amp;lt;/code&amp;gt; . Для восстановления пропущенных комментариев '''вначале''' выполнить команду save с флагом --merge и указать бэкап откуда делался restore ранее. Утилита дозапишет пропущенные данные в бэкап и при использовании restore они будут дозаписаны в базу&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-12-18@05:11:18.075773d1&lt;br /&gt;
|&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;reviewer migrate save&amp;lt;/code&amp;gt; для сохранения разметки и комментариев из базы&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;reviewer migrate restore&amp;lt;/code&amp;gt; для восстановления разметки и комментариев&lt;br /&gt;
&lt;br /&gt;
Команды предназначены для исправления пропущенной разметки или комментариев при апгрейде со старых версий Svacer на последний релиз. &lt;br /&gt;
&lt;br /&gt;
Команды работают напрямую с базой. Могут также использоваться для бэкапа данных разметки и комментариев&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-09-15@04:26:40.654d90f2&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-invariants&amp;lt;/code&amp;gt; для дублей инвариантов&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-all&amp;lt;/code&amp;gt; для дублей комментариев, инвариантов и потенциально иных проблем&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;safe-copy&amp;lt;/code&amp;gt;для копирования разметки между ветками с автоисправлением дублей комментариев и инвариантов&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
Файл с тремя предикатами, для случая изменения версий go модулей в пакете go-jmespath (&amp;lt;code&amp;gt;jmespath -&amp;gt; go-jmespath&amp;lt;/code&amp;gt;)&lt;br /&gt;
 // common case for function changes&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go-jmespath case&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line, details)&lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go mod versions&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         same_go_path() &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3454</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3454"/>
		<updated>2026-01-13T11:25:04Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2026-01-13@11:09:25.33b8eabd&lt;br /&gt;
|&lt;br /&gt;
* Добвлен флаг &amp;lt;code&amp;gt;--merge&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;reviewer migrate save&amp;lt;/code&amp;gt; для обновление созданного бэкапа разметки&lt;br /&gt;
* Исправлен пропуск комментариев при команде &amp;lt;code&amp;gt;reviewer migrate restore&amp;lt;/code&amp;gt; . Для восстановления пропущенных комментариев '''вначале''' выполнить команду save с флагом --merge и указать бэкап откуда делался restore ранее. Утилита дозапишет пропущенные данные в бэкап и при использовании restore они будут дозаписаны в базу&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-12-18@05:11:18.075773d1&lt;br /&gt;
|&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;reviewer migrate save&amp;lt;/code&amp;gt; для сохранения разметки и комментариев из базы&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;reviewer migrate restore&amp;lt;/code&amp;gt; для восстановления разметки и комментариев&lt;br /&gt;
&lt;br /&gt;
Команды предназначены для исправления пропущенной разметки или комментариев при апгрейде со старых версий Svacer на последний релиз. &lt;br /&gt;
&lt;br /&gt;
Команды работают напрямую с базой. Могут также использоваться для бэкапа данных разметки и комментариев&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-09-15@04:26:40.654d90f2&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-invariants&amp;lt;/code&amp;gt; для дублей инвариантов&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-all&amp;lt;/code&amp;gt; для дублей комментариев, инвариантов и потенциально иных проблем&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;safe-copy&amp;lt;/code&amp;gt;для копирования разметки между ветками с автоисправлением дублей комментариев и инвариантов&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
Файл с тремя предикатами, для случая изменения версий go модулей в пакете go-jmespath (&amp;lt;code&amp;gt;jmespath -&amp;gt; go-jmespath&amp;lt;/code&amp;gt;)&lt;br /&gt;
 // common case for function changes&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go-jmespath case&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line, details)&lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go mod versions&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         same_go_path() &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3446</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3446"/>
		<updated>2025-12-18T06:16:32Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-12-18@05:11:18.075773d1&lt;br /&gt;
|&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;reviewer migrate save&amp;lt;/code&amp;gt; для сохранения разметки и комментариев из базы&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;reviewer migrate restore&amp;lt;/code&amp;gt; для восстановления разметки и комментариев&lt;br /&gt;
&lt;br /&gt;
Вышеприведенные команды предназначены для исправления пропущенной разметки или комментариев при апгрейде со старых версих Svacer на последний релиз. &lt;br /&gt;
&lt;br /&gt;
Команды работают напрямую с базой. Могут так же использоваться для бэкапа данных разметки и комментариев&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-09-15@04:26:40.654d90f2&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-invariants&amp;lt;/code&amp;gt; для дублей инвариантов&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-all&amp;lt;/code&amp;gt; для дублей комментариев, инвариантов и потенциально иных проблем&lt;br /&gt;
* Добавлена команда &amp;lt;code&amp;gt;safe-copy&amp;lt;/code&amp;gt;для копирования разметки между ветками с автоисправлением дублей комментариев и инвариантов&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
Файл с тремя предикатами, для случая изменения версий go модулей в пакете go-jmespath (&amp;lt;code&amp;gt;jmespath -&amp;gt; go-jmespath&amp;lt;/code&amp;gt;)&lt;br /&gt;
 // common case for function changes&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go-jmespath case&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line, details)&lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go mod versions&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         same_go_path() &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3390</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3390"/>
		<updated>2025-11-27T10:20:27Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* API методы на fullmarkers позволяют указать фильтр с полем фильтрации по checker reliability&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров под id и инварианту.&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления (должно снизить использование памяти при импорте)&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера, показываемого в WEB интерфейсе, ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл не ограничивается в размерах и кнопка выгрузки лога выгружает полный лог. &lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом [[Afilters]]&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* ['''Экспериментально''']  Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3388</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3388"/>
		<updated>2025-11-27T09:38:13Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Release 12-0-0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров под id и инварианту.&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления (должно снизить использование памяти при импорте)&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера, показываемого в WEB интерфейсе, ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл не ограничивается в размерах и кнопка выгрузки лога выгружает полный лог. &lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом [[Afilters]]&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* ['''Экспериментально''']  Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Afilters&amp;diff=3387</id>
		<title>Afilters</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Afilters&amp;diff=3387"/>
		<updated>2025-11-27T09:36:58Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Описание языка предикатов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Advanced filters ==&lt;br /&gt;
Поле &amp;quot;Расширенный фильтр&amp;quot; в пользовательских фильтрах предназначено для фильтрации маркеров (предупреждений) по сложным предикатам. &lt;br /&gt;
[[File:Image-afilters-prop.png|thumb]]&lt;br /&gt;
Предикат может использовать:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т.п.)&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте)&lt;br /&gt;
* статусы разметки&lt;br /&gt;
* текст и атрибуты комментариев&lt;br /&gt;
&lt;br /&gt;
Формат фильтра определяется следующим шаблоном:&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(markers, &amp;lt;predicate expr&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
Выражение &amp;lt;code&amp;gt;&amp;lt;predicate expr&amp;gt;&amp;lt;/code&amp;gt; определяет предикат. Объект &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; содержит массив маркеров из контекста, функция &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; фильтрует данный список по предикату. Таким образом, применение фильтра заключается в фильтрации списка маркеров по указанному предикату.&lt;br /&gt;
&lt;br /&gt;
== Список доступных полей ==&lt;br /&gt;
&lt;br /&gt;
=== Поля маркера (предупреждения) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Comments&amp;lt;/code&amp;gt; - список комментариев маркера. Объект типа Comment (смотреть ниже)&lt;br /&gt;
* &amp;lt;code&amp;gt;Details&amp;lt;/code&amp;gt; - информация, специфичная для анализатора. Ближайший аналог - fingerprint в SARIF&lt;br /&gt;
* &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; - имя файла&lt;br /&gt;
* &amp;lt;code&amp;gt;Function&amp;lt;/code&amp;gt; - имя функции, может быть managled для С++&lt;br /&gt;
* &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; - UUID маркера&lt;br /&gt;
* &amp;lt;code&amp;gt;Invariant&amp;lt;/code&amp;gt; - инвариант маркера. Используется для авто-переноса разметки между снимками&lt;br /&gt;
* &amp;lt;code&amp;gt;Lang&amp;lt;/code&amp;gt; - язык детектора&lt;br /&gt;
* &amp;lt;code&amp;gt;Line&amp;lt;/code&amp;gt; - номер строки в файле&lt;br /&gt;
* &amp;lt;code&amp;gt;LocID&amp;lt;/code&amp;gt; - порядковый номер маркера относительно изначального отчета анализатора&lt;br /&gt;
* &amp;lt;code&amp;gt;MTid&amp;lt;/code&amp;gt; - шаблон сообщения&lt;br /&gt;
* &amp;lt;code&amp;gt;Msg&amp;lt;/code&amp;gt; - текст сообщения&lt;br /&gt;
* &amp;lt;code&amp;gt;OrigFunc&amp;lt;/code&amp;gt; - 'человекочитаемое' имя функции. Может быть недоступно&lt;br /&gt;
* &amp;lt;code&amp;gt;Tags&amp;lt;/code&amp;gt; - список тэгов(меток) маркера&lt;br /&gt;
* &amp;lt;code&amp;gt;Tool&amp;lt;/code&amp;gt; - модуль анализатора, ответственного за данный детектор&lt;br /&gt;
* &amp;lt;code&amp;gt;Traces&amp;lt;/code&amp;gt; - список трасс маркера. Объект типа Trace (смотреть ниже)&lt;br /&gt;
* &amp;lt;code&amp;gt;WarnClass&amp;lt;/code&amp;gt; - название детектора/класса детекторов&lt;br /&gt;
&lt;br /&gt;
Имена полей могут так же использоваться в формате, где первая буква в lower-case.&lt;br /&gt;
&lt;br /&gt;
Помимо использования полей, пользователь может использовать вспомогательные функции для доступа к дополнительной информации:&lt;br /&gt;
 &amp;lt;code&amp;gt;severity(item) string - серьезность детектора (чекера). &lt;br /&gt;
 Пример: filter(markers, severity(#) == &amp;quot;Critical&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Внимание:''' Использование в предикатах поля &amp;lt;code&amp;gt;Trace&amp;lt;/code&amp;gt; может сказаться на скорости применения фильтра, т.к загрузка большого числа трасс может занять время.&lt;br /&gt;
&lt;br /&gt;
=== Данные о разметке ===&lt;br /&gt;
Поддерживаются следующие функции для получения информации о разметки:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status(item) string&amp;lt;/code&amp;gt; - статус разметки текущего маркера. Пример: &amp;lt;code&amp;gt;filter(markers, status(#) == &amp;quot;Confirmed&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;action(item) string&amp;lt;/code&amp;gt; - статус поля action текущего маркера.  Пример: &amp;lt;code&amp;gt;filter(markers, action(#) == &amp;quot;Ignore&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mseverity(item) string&amp;lt;/code&amp;gt; - статус поля severity текущего маркера (не путать с severity детектора).  Пример: &amp;lt;code&amp;gt;filter(markers, mseverity(#) == &amp;quot;Critical&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triaged(item) bool&amp;lt;/code&amp;gt; - возвращает true, если маркер имеет не дефолтную разметку. Пример: &amp;lt;code&amp;gt;filter(markers, triaged(#))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get_triaged_by(item) UserInfo&amp;lt;/code&amp;gt; - возвращает структуру, с информацией о пользователе, кто произвел разметку&lt;br /&gt;
&lt;br /&gt;
Поля структуры &amp;lt;code&amp;gt;UserInfo&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;login: string&amp;lt;/code&amp;gt; - логин юзера&lt;br /&gt;
* &amp;lt;code&amp;gt;create_ts: Time (UTC)&amp;lt;/code&amp;gt; - время разметки в &amp;lt;code&amp;gt;UTC&amp;lt;/code&amp;gt; формате (RFC3339)&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
Объекты типа &amp;lt;code&amp;gt;Comment&amp;lt;/code&amp;gt; содержатся в поле &amp;lt;code&amp;gt;Comments&amp;lt;/code&amp;gt; маркера. Объект имеет следующие поля:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; - UUID комментария&lt;br /&gt;
* &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; - текст комментария&lt;br /&gt;
* &amp;lt;code&amp;gt;CreatedBy&amp;lt;/code&amp;gt; - имя пользователя, кто создал комментарий&lt;br /&gt;
* &amp;lt;code&amp;gt;CreateTs&amp;lt;/code&amp;gt;  - время создания комментария (объект типа &amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;UpdateTs&amp;lt;/code&amp;gt; - время обновления комментария (объект типа &amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;), может быть пустым&lt;br /&gt;
* &amp;lt;code&amp;gt;UpdatedBy&amp;lt;/code&amp;gt; - имя пользователя, кто обновил комментарий&lt;br /&gt;
&lt;br /&gt;
=== Трассы ===&lt;br /&gt;
Маркер может содержать трассу маркера в поле &amp;lt;code&amp;gt;Traces&amp;lt;/code&amp;gt;. Трасса описывается следующими структурами:&lt;br /&gt;
 &amp;lt;code&amp;gt;type Trace struct {&lt;br /&gt;
 	Role      string&lt;br /&gt;
 	Locations []TraceEntry&lt;br /&gt;
 }&lt;br /&gt;
 type TraceEntry struct {&lt;br /&gt;
 	File     string	&lt;br /&gt;
 	Line     uint32&lt;br /&gt;
 	Col  	 uint32	&lt;br /&gt;
 	Info 	 string&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Доступ к полям объекта &amp;lt;code&amp;gt;Trace&amp;lt;/code&amp;gt; может выполняться используя правила языка &amp;lt;code&amp;gt;go-expr&amp;lt;/code&amp;gt;, описанные ниже.&lt;br /&gt;
&lt;br /&gt;
Имена полей могут использоваться в виде как описано выше, либо в формате lower-case: &amp;lt;code&amp;gt;role, locations, file, line, col, info&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(markers, any(.Comments, .Text == &amp;quot;Test&amp;quot;)  &amp;amp;&amp;amp;&lt;br /&gt;
 		any(.Traces, any(.Locations, .Info == &amp;quot;Boolean expression has constant value&amp;quot;))&lt;br /&gt;
 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Поля снимка ===&lt;br /&gt;
Для доступа к полям снимка пользователь может использовать переменную &amp;lt;code&amp;gt;snapshot&amp;lt;/code&amp;gt;. Переменная имеет тип структуры со следующими полями&lt;br /&gt;
 &amp;lt;code&amp;gt;struct {&lt;br /&gt;
 	ID               string                &lt;br /&gt;
 	Name             string                &lt;br /&gt;
 	SerialID         uint32                &lt;br /&gt;
 	BuildObject      string                &lt;br /&gt;
 	ResultsObject    string                &lt;br /&gt;
 	ImportTime       time.Time             &lt;br /&gt;
 	CreatedBy        string                &lt;br /&gt;
 	CreatedByID      string                &lt;br /&gt;
 	Details          map[string]any&lt;br /&gt;
 	CreateTime       time.Time             &lt;br /&gt;
 	SourcesAvailable bool                  &lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Имена полей могут использоваться в виде, где первая буква в lower case.&lt;br /&gt;
&lt;br /&gt;
Объекты в поле &amp;lt;code&amp;gt;Details&amp;lt;/code&amp;gt; можно просмотреть нажав на &amp;lt;code&amp;gt;View JSON&amp;lt;/code&amp;gt; кнопку в WebUI в поле &amp;lt;code&amp;gt;Snapshot Information&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(markers, &lt;br /&gt;
    snapshot.buildObject == &amp;quot;5b634b75422bd554a8569cc10bfadc3aea77b73e&amp;quot; &amp;amp;&amp;amp;&lt;br /&gt;
    .warnClass matches &amp;quot;DEREF&amp;quot;&lt;br /&gt;
 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Описание языка предикатов =&lt;br /&gt;
Для написания предикатов используется язык  '''Expr'''. Детальное описание всех возможностей можно найти здесь: https://github.com/expr-lang/expr &lt;br /&gt;
&lt;br /&gt;
Далее описываются конструкции, наиболее подходящие для написания правил фильтрации.&lt;br /&gt;
&lt;br /&gt;
== Литералы ==&lt;br /&gt;
 &amp;lt;code&amp;gt;Comment /* */ or //&lt;br /&gt;
 Boolean true, false&lt;br /&gt;
 Integer 42, 0x2A, 0o52, 0b101010&lt;br /&gt;
 Float 0.5, .5&lt;br /&gt;
 String &amp;quot;foo&amp;quot;, 'bar'&lt;br /&gt;
 Array [1, 2, 3]&lt;br /&gt;
 Map {a: 1, b: 2, c: 3}&lt;br /&gt;
 Nil nil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строки могут быть в одинарных и двойных кавычках. Для эскейпа использовать обратный слэш.&lt;br /&gt;
&lt;br /&gt;
Пример однострочного текста:&lt;br /&gt;
     &amp;lt;code&amp;gt;&amp;quot;Hello\nWorld&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Пример многострочного текста:&lt;br /&gt;
     &amp;lt;code&amp;gt;`Hello&lt;br /&gt;
     World`&amp;lt;/code&amp;gt;&lt;br /&gt;
В многострочном тексте escape-последовательности не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
 &amp;lt;code&amp;gt;Arithmetic: +, -, *, /, % (modulus), ^ or ** (exponent)&lt;br /&gt;
 Comparison: ==, !=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=&lt;br /&gt;
 Logical: not or !, and or &amp;amp;&amp;amp;, or or ||&lt;br /&gt;
 Conditional: ?: (ternary), ?? (nil coalescing), if {} else {} (multiline)&lt;br /&gt;
 Membership:  [], ., ?., in&lt;br /&gt;
 String:  + (concatenation), contains, startsWith, endsWith&lt;br /&gt;
 Regex:  matches&lt;br /&gt;
 Range ..&lt;br /&gt;
 Slice [:]&lt;br /&gt;
 Pipe |&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Операторы доступа к полю объекта ===&lt;br /&gt;
Пользователь может использовать оператор точка &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; и оператор &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;:&lt;br /&gt;
     &amp;lt;code&amp;gt;user.Name&lt;br /&gt;
     user[&amp;quot;Name&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Оператор in ===&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; для проверки наличия объекта в массиве или мэпе:&lt;br /&gt;
     &amp;lt;code&amp;gt;&amp;quot;John&amp;quot; in [&amp;quot;John&amp;quot;, &amp;quot;Jane&amp;quot;]&lt;br /&gt;
     &amp;quot;name&amp;quot; in {&amp;quot;name&amp;quot;: &amp;quot;John&amp;quot;, &amp;quot;age&amp;quot;: 30}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Optional chaining ====&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; может использоваться для доступа к полю структуры или элементу отображения (map) без необходимости проверки, является ли структура или отображение равными &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;. Если структура или отображение имеют значение &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, результатом выражения будет &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример вида:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User?.Name&amp;lt;/code&amp;gt;&lt;br /&gt;
значит тоже самое, что:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User != nil ? author.User.Name : nil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nil coalescing ====&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;??&amp;lt;/code&amp;gt; может использоваться для возврата левого операнда, если он не равен &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, в противном случае возвращается правый операнд.&lt;br /&gt;
&lt;br /&gt;
Пример вида:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User?.Name ?? &amp;quot;Anonymous&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
значит тоже самое, что:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User != nil ? author.User.Name : &amp;quot;Anonymous&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Оператор конвейера ===&lt;br /&gt;
Оператор конвейера &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; может использоваться для передачи результата выражения левого операнда в качестве первого аргумента выражения правого операнда.&lt;br /&gt;
&lt;br /&gt;
Пример вида:&lt;br /&gt;
     &amp;lt;code&amp;gt;user.Name | lower() | split(&amp;quot; &amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
значит тоже самое, что:&lt;br /&gt;
     &amp;lt;code&amp;gt;split(lower(user.Name), &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предикаты ==&lt;br /&gt;
Предикат — это выражение. Предикаты можно использовать в функциях, таких как filter, all, any, one, none и других.&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(0..9, {# % 2 == 0})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(tweets, {len(.Content) &amp;gt; 240})&amp;lt;/code&amp;gt;&lt;br /&gt;
Скобки можно опускать  &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;:&lt;br /&gt;
     &amp;lt;code&amp;gt;filter(tweets, len(.Content) &amp;gt; 240)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции над строками ==&lt;br /&gt;
 &amp;lt;code&amp;gt;trim(str[, chars])&lt;br /&gt;
 trimPrefix(str, prefix)&lt;br /&gt;
 trimSuffix(str, suffix)&lt;br /&gt;
 upper(str)&lt;br /&gt;
 lower(str)&lt;br /&gt;
 indexOf(str, substring)&lt;br /&gt;
 lastIndexOf(str, substring)&lt;br /&gt;
 hasPrefix(str, prefix)&lt;br /&gt;
 hasSuffix(str, suffix)&amp;lt;/code&amp;gt;&lt;br /&gt;
Так же есть оператор &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; для поиска регулярного выражения в строке:&lt;br /&gt;
     &amp;lt;code&amp;gt;str matches &amp;quot;regular expression&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Для сопоставления целой строки с регулярным выражением следует использовать вариант:&lt;br /&gt;
     &amp;lt;code&amp;gt;str matches &amp;quot;^regex$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции времени ==&lt;br /&gt;
Поддерживаются Go типы для времени и интервалов (&amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;time.Duration&amp;lt;/code&amp;gt;) time package.&lt;br /&gt;
&lt;br /&gt;
Можно использовать операции сложения и вычитания над объектами с типом &amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;code&amp;gt;createdAt - now()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;createdAt + duration(&amp;quot;1h&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;createdAt &amp;gt; now() - duration(&amp;quot;1h&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;date(&amp;quot;2023-08-14&amp;quot;)&lt;br /&gt;
 date(&amp;quot;15:04:05&amp;quot;)&lt;br /&gt;
 date(&amp;quot;2023-08-14T00:00:00Z&amp;quot;)&lt;br /&gt;
 date(&amp;quot;2023-08-14 00:00:00&amp;quot;, &amp;quot;2006-01-02 15:04:05&amp;quot;, &amp;quot;Europe/Zurich&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции над массивами ==&lt;br /&gt;
 &amp;lt;code&amp;gt;- all(array, predicate) - все объекты должны удовлетворять предикату&lt;br /&gt;
 - any(array, predicate) - должен быть по крайней мере один объект, который удовлетворяет предикату&lt;br /&gt;
 - one(array, predicate) - должен быть только один объект, который удовлетворяет предикату&lt;br /&gt;
 - none(array, predicate) - ни один объект не должен удовлетворять предикату&lt;br /&gt;
 - find(array, predicate) - возвращает первый объект, который удовлетворяет предикату&lt;br /&gt;
 - findLast(array, predicate) - возвращает последний объект, который удовлетворяет предикату&lt;br /&gt;
 - count(array[, predicate]) - возвращает число объектов, удовлетворяющих предикату&lt;br /&gt;
 - first(array) - первый объект из массива&lt;br /&gt;
 - last(array) - последний объект из массива&amp;lt;/code&amp;gt;&lt;br /&gt;
Примеры:&lt;br /&gt;
     &amp;lt;code&amp;gt;all(tweets, {.Size &amp;lt; 280})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;any(tweets, {.Size &amp;gt; 280})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;none(tweets, {.Size &amp;gt; 280})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;find([1, 2, 3, 4], # &amp;gt; 2) == 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;findLast([1, 2, 3, 4], # &amp;gt; 2) == 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;count(users, .Age &amp;gt; 18)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;first([1, 2, 3]) == 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;last([1, 2, 3]) == 3&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Afilters&amp;diff=3386</id>
		<title>Afilters</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Afilters&amp;diff=3386"/>
		<updated>2025-11-27T09:36:04Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Описание advanced filters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Advanced filters ==&lt;br /&gt;
Поле &amp;quot;Расширенный фильтр&amp;quot; в пользовательских фильтрах предназначено для фильтрации маркеров (предупреждений) по сложным предикатам. &lt;br /&gt;
[[File:Image-afilters-prop.png|thumb]]&lt;br /&gt;
Предикат может использовать:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т.п.)&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте)&lt;br /&gt;
* статусы разметки&lt;br /&gt;
* текст и атрибуты комментариев&lt;br /&gt;
&lt;br /&gt;
Формат фильтра определяется следующим шаблоном:&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(markers, &amp;lt;predicate expr&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
Выражение &amp;lt;code&amp;gt;&amp;lt;predicate expr&amp;gt;&amp;lt;/code&amp;gt; определяет предикат. Объект &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; содержит массив маркеров из контекста, функция &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; фильтрует данный список по предикату. Таким образом, применение фильтра заключается в фильтрации списка маркеров по указанному предикату.&lt;br /&gt;
&lt;br /&gt;
== Список доступных полей ==&lt;br /&gt;
&lt;br /&gt;
=== Поля маркера (предупреждения) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Comments&amp;lt;/code&amp;gt; - список комментариев маркера. Объект типа Comment (смотреть ниже)&lt;br /&gt;
* &amp;lt;code&amp;gt;Details&amp;lt;/code&amp;gt; - информация, специфичная для анализатора. Ближайший аналог - fingerprint в SARIF&lt;br /&gt;
* &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; - имя файла&lt;br /&gt;
* &amp;lt;code&amp;gt;Function&amp;lt;/code&amp;gt; - имя функции, может быть managled для С++&lt;br /&gt;
* &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; - UUID маркера&lt;br /&gt;
* &amp;lt;code&amp;gt;Invariant&amp;lt;/code&amp;gt; - инвариант маркера. Используется для авто-переноса разметки между снимками&lt;br /&gt;
* &amp;lt;code&amp;gt;Lang&amp;lt;/code&amp;gt; - язык детектора&lt;br /&gt;
* &amp;lt;code&amp;gt;Line&amp;lt;/code&amp;gt; - номер строки в файле&lt;br /&gt;
* &amp;lt;code&amp;gt;LocID&amp;lt;/code&amp;gt; - порядковый номер маркера относительно изначального отчета анализатора&lt;br /&gt;
* &amp;lt;code&amp;gt;MTid&amp;lt;/code&amp;gt; - шаблон сообщения&lt;br /&gt;
* &amp;lt;code&amp;gt;Msg&amp;lt;/code&amp;gt; - текст сообщения&lt;br /&gt;
* &amp;lt;code&amp;gt;OrigFunc&amp;lt;/code&amp;gt; - 'человекочитаемое' имя функции. Может быть недоступно&lt;br /&gt;
* &amp;lt;code&amp;gt;Tags&amp;lt;/code&amp;gt; - список тэгов(меток) маркера&lt;br /&gt;
* &amp;lt;code&amp;gt;Tool&amp;lt;/code&amp;gt; - модуль анализатора, ответственного за данный детектор&lt;br /&gt;
* &amp;lt;code&amp;gt;Traces&amp;lt;/code&amp;gt; - список трасс маркера. Объект типа Trace (смотреть ниже)&lt;br /&gt;
* &amp;lt;code&amp;gt;WarnClass&amp;lt;/code&amp;gt; - название детектора/класса детекторов&lt;br /&gt;
&lt;br /&gt;
Имена полей могут так же использоваться в формате, где первая буква в lower-case.&lt;br /&gt;
&lt;br /&gt;
Помимо использования полей, пользователь может использовать вспомогательные функции для доступа к дополнительной информации:&lt;br /&gt;
 &amp;lt;code&amp;gt;severity(item) string - серьезность детектора (чекера). &lt;br /&gt;
 Пример: filter(markers, severity(#) == &amp;quot;Critical&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Внимание:''' Использование в предикатах поля &amp;lt;code&amp;gt;Trace&amp;lt;/code&amp;gt; может сказаться на скорости применения фильтра, т.к загрузка большого числа трасс может занять время.&lt;br /&gt;
&lt;br /&gt;
=== Данные о разметке ===&lt;br /&gt;
Поддерживаются следующие функции для получения информации о разметки:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status(item) string&amp;lt;/code&amp;gt; - статус разметки текущего маркера. Пример: &amp;lt;code&amp;gt;filter(markers, status(#) == &amp;quot;Confirmed&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;action(item) string&amp;lt;/code&amp;gt; - статус поля action текущего маркера.  Пример: &amp;lt;code&amp;gt;filter(markers, action(#) == &amp;quot;Ignore&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mseverity(item) string&amp;lt;/code&amp;gt; - статус поля severity текущего маркера (не путать с severity детектора).  Пример: &amp;lt;code&amp;gt;filter(markers, mseverity(#) == &amp;quot;Critical&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triaged(item) bool&amp;lt;/code&amp;gt; - возвращает true, если маркер имеет не дефолтную разметку. Пример: &amp;lt;code&amp;gt;filter(markers, triaged(#))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get_triaged_by(item) UserInfo&amp;lt;/code&amp;gt; - возвращает структуру, с информацией о пользователе, кто произвел разметку&lt;br /&gt;
&lt;br /&gt;
Поля структуры &amp;lt;code&amp;gt;UserInfo&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;login: string&amp;lt;/code&amp;gt; - логин юзера&lt;br /&gt;
* &amp;lt;code&amp;gt;create_ts: Time (UTC)&amp;lt;/code&amp;gt; - время разметки в &amp;lt;code&amp;gt;UTC&amp;lt;/code&amp;gt; формате (RFC3339)&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
Объекты типа &amp;lt;code&amp;gt;Comment&amp;lt;/code&amp;gt; содержатся в поле &amp;lt;code&amp;gt;Comments&amp;lt;/code&amp;gt; маркера. Объект имеет следующие поля:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; - UUID комментария&lt;br /&gt;
* &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; - текст комментария&lt;br /&gt;
* &amp;lt;code&amp;gt;CreatedBy&amp;lt;/code&amp;gt; - имя пользователя, кто создал комментарий&lt;br /&gt;
* &amp;lt;code&amp;gt;CreateTs&amp;lt;/code&amp;gt;  - время создания комментария (объект типа &amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;UpdateTs&amp;lt;/code&amp;gt; - время обновления комментария (объект типа &amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;), может быть пустым&lt;br /&gt;
* &amp;lt;code&amp;gt;UpdatedBy&amp;lt;/code&amp;gt; - имя пользователя, кто обновил комментарий&lt;br /&gt;
&lt;br /&gt;
=== Трассы ===&lt;br /&gt;
Маркер может содержать трассу маркера в поле &amp;lt;code&amp;gt;Traces&amp;lt;/code&amp;gt;. Трасса описывается следующими структурами:&lt;br /&gt;
 &amp;lt;code&amp;gt;type Trace struct {&lt;br /&gt;
 	Role      string&lt;br /&gt;
 	Locations []TraceEntry&lt;br /&gt;
 }&lt;br /&gt;
 type TraceEntry struct {&lt;br /&gt;
 	File     string	&lt;br /&gt;
 	Line     uint32&lt;br /&gt;
 	Col  	 uint32	&lt;br /&gt;
 	Info 	 string&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Доступ к полям объекта &amp;lt;code&amp;gt;Trace&amp;lt;/code&amp;gt; может выполняться используя правила языка &amp;lt;code&amp;gt;go-expr&amp;lt;/code&amp;gt;, описанные ниже.&lt;br /&gt;
&lt;br /&gt;
Имена полей могут использоваться в виде как описано выше, либо в формате lower-case: &amp;lt;code&amp;gt;role, locations, file, line, col, info&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(markers, any(.Comments, .Text == &amp;quot;Test&amp;quot;)  &amp;amp;&amp;amp;&lt;br /&gt;
 		any(.Traces, any(.Locations, .Info == &amp;quot;Boolean expression has constant value&amp;quot;))&lt;br /&gt;
 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Поля снимка ===&lt;br /&gt;
Для доступа к полям снимка пользователь может использовать переменную &amp;lt;code&amp;gt;snapshot&amp;lt;/code&amp;gt;. Переменная имеет тип структуры со следующими полями&lt;br /&gt;
 &amp;lt;code&amp;gt;struct {&lt;br /&gt;
 	ID               string                &lt;br /&gt;
 	Name             string                &lt;br /&gt;
 	SerialID         uint32                &lt;br /&gt;
 	BuildObject      string                &lt;br /&gt;
 	ResultsObject    string                &lt;br /&gt;
 	ImportTime       time.Time             &lt;br /&gt;
 	CreatedBy        string                &lt;br /&gt;
 	CreatedByID      string                &lt;br /&gt;
 	Details          map[string]any&lt;br /&gt;
 	CreateTime       time.Time             &lt;br /&gt;
 	SourcesAvailable bool                  &lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Имена полей могут использоваться в виде, где первая буква в lower case.&lt;br /&gt;
&lt;br /&gt;
Объекты в поле &amp;lt;code&amp;gt;Details&amp;lt;/code&amp;gt; можно просмотреть нажав на &amp;lt;code&amp;gt;View JSON&amp;lt;/code&amp;gt; кнопку в WebUI в поле &amp;lt;code&amp;gt;Snapshot Information&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(markers, &lt;br /&gt;
    snapshot.buildObject == &amp;quot;5b634b75422bd554a8569cc10bfadc3aea77b73e&amp;quot; &amp;amp;&amp;amp;&lt;br /&gt;
    .warnClass matches &amp;quot;DEREF&amp;quot;&lt;br /&gt;
 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Описание языка предикатов =&lt;br /&gt;
Для написания предикатов используется язык  '''Expr'''. Детальное описание всех возможностей можно найти здесь: &amp;lt;nowiki&amp;gt;https://github.com/expr-lang/expr&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее описываются конструкции, наиболее подходящие для написания правил фильтрации.&lt;br /&gt;
&lt;br /&gt;
== Литералы ==&lt;br /&gt;
 &amp;lt;code&amp;gt;Comment /* */ or //&lt;br /&gt;
 Boolean true, false&lt;br /&gt;
 Integer 42, 0x2A, 0o52, 0b101010&lt;br /&gt;
 Float 0.5, .5&lt;br /&gt;
 String &amp;quot;foo&amp;quot;, 'bar'&lt;br /&gt;
 Array [1, 2, 3]&lt;br /&gt;
 Map {a: 1, b: 2, c: 3}&lt;br /&gt;
 Nil nil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строки могут быть в одинарных и двойных кавычках. Для эскейпа использовать обратный слэш.&lt;br /&gt;
&lt;br /&gt;
Пример однострочного текста:&lt;br /&gt;
     &amp;lt;code&amp;gt;&amp;quot;Hello\nWorld&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Пример многострочного текста:&lt;br /&gt;
     &amp;lt;code&amp;gt;`Hello&lt;br /&gt;
     World`&amp;lt;/code&amp;gt;&lt;br /&gt;
В многострочном тексте escape-последовательности не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
 &amp;lt;code&amp;gt;Arithmetic: +, -, *, /, % (modulus), ^ or ** (exponent)&lt;br /&gt;
 Comparison: ==, !=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=&lt;br /&gt;
 Logical: not or !, and or &amp;amp;&amp;amp;, or or ||&lt;br /&gt;
 Conditional: ?: (ternary), ?? (nil coalescing), if {} else {} (multiline)&lt;br /&gt;
 Membership:  [], ., ?., in&lt;br /&gt;
 String:  + (concatenation), contains, startsWith, endsWith&lt;br /&gt;
 Regex:  matches&lt;br /&gt;
 Range ..&lt;br /&gt;
 Slice [:]&lt;br /&gt;
 Pipe |&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Операторы доступа к полю объекта ===&lt;br /&gt;
Пользователь может использовать оператор точка &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; и оператор &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;:&lt;br /&gt;
     &amp;lt;code&amp;gt;user.Name&lt;br /&gt;
     user[&amp;quot;Name&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Оператор in ===&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; для проверки наличия объекта в массиве или мэпе:&lt;br /&gt;
     &amp;lt;code&amp;gt;&amp;quot;John&amp;quot; in [&amp;quot;John&amp;quot;, &amp;quot;Jane&amp;quot;]&lt;br /&gt;
     &amp;quot;name&amp;quot; in {&amp;quot;name&amp;quot;: &amp;quot;John&amp;quot;, &amp;quot;age&amp;quot;: 30}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Optional chaining ====&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; может использоваться для доступа к полю структуры или элементу отображения (map) без необходимости проверки, является ли структура или отображение равными &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;. Если структура или отображение имеют значение &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, результатом выражения будет &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример вида:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User?.Name&amp;lt;/code&amp;gt;&lt;br /&gt;
значит тоже самое, что:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User != nil ? author.User.Name : nil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nil coalescing ====&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;??&amp;lt;/code&amp;gt; может использоваться для возврата левого операнда, если он не равен &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, в противном случае возвращается правый операнд.&lt;br /&gt;
&lt;br /&gt;
Пример вида:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User?.Name ?? &amp;quot;Anonymous&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
значит тоже самое, что:&lt;br /&gt;
     &amp;lt;code&amp;gt;author.User != nil ? author.User.Name : &amp;quot;Anonymous&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Оператор конвейера ===&lt;br /&gt;
Оператор конвейера &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; может использоваться для передачи результата выражения левого операнда в качестве первого аргумента выражения правого операнда.&lt;br /&gt;
&lt;br /&gt;
Пример вида:&lt;br /&gt;
     &amp;lt;code&amp;gt;user.Name | lower() | split(&amp;quot; &amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
значит тоже самое, что:&lt;br /&gt;
     &amp;lt;code&amp;gt;split(lower(user.Name), &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предикаты ==&lt;br /&gt;
Предикат — это выражение. Предикаты можно использовать в функциях, таких как filter, all, any, one, none и других.&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(0..9, {# % 2 == 0})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;filter(tweets, {len(.Content) &amp;gt; 240})&amp;lt;/code&amp;gt;&lt;br /&gt;
Скобки можно опускать  &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;:&lt;br /&gt;
     &amp;lt;code&amp;gt;filter(tweets, len(.Content) &amp;gt; 240)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции над строками ==&lt;br /&gt;
 &amp;lt;code&amp;gt;trim(str[, chars])&lt;br /&gt;
 trimPrefix(str, prefix)&lt;br /&gt;
 trimSuffix(str, suffix)&lt;br /&gt;
 upper(str)&lt;br /&gt;
 lower(str)&lt;br /&gt;
 indexOf(str, substring)&lt;br /&gt;
 lastIndexOf(str, substring)&lt;br /&gt;
 hasPrefix(str, prefix)&lt;br /&gt;
 hasSuffix(str, suffix)&amp;lt;/code&amp;gt;&lt;br /&gt;
Так же есть оператор &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; для поиска регулярного выражения в строке:&lt;br /&gt;
     &amp;lt;code&amp;gt;str matches &amp;quot;regular expression&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Для сопоставления целой строки с регулярным выражением следует использовать вариант:&lt;br /&gt;
     &amp;lt;code&amp;gt;str matches &amp;quot;^regex$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции времени ==&lt;br /&gt;
Поддерживаются Go типы для времени и интервалов (&amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;time.Duration&amp;lt;/code&amp;gt;) time package.&lt;br /&gt;
&lt;br /&gt;
Можно использовать операции сложения и вычитания над объектами с типом &amp;lt;code&amp;gt;time.Time&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;code&amp;gt;createdAt - now()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;createdAt + duration(&amp;quot;1h&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;createdAt &amp;gt; now() - duration(&amp;quot;1h&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;date(&amp;quot;2023-08-14&amp;quot;)&lt;br /&gt;
 date(&amp;quot;15:04:05&amp;quot;)&lt;br /&gt;
 date(&amp;quot;2023-08-14T00:00:00Z&amp;quot;)&lt;br /&gt;
 date(&amp;quot;2023-08-14 00:00:00&amp;quot;, &amp;quot;2006-01-02 15:04:05&amp;quot;, &amp;quot;Europe/Zurich&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции над массивами ==&lt;br /&gt;
 &amp;lt;code&amp;gt;- all(array, predicate) - все объекты должны удовлетворять предикату&lt;br /&gt;
 - any(array, predicate) - должен быть по крайней мере один объект, который удовлетворяет предикату&lt;br /&gt;
 - one(array, predicate) - должен быть только один объект, который удовлетворяет предикату&lt;br /&gt;
 - none(array, predicate) - ни один объект не должен удовлетворять предикату&lt;br /&gt;
 - find(array, predicate) - возвращает первый объект, который удовлетворяет предикату&lt;br /&gt;
 - findLast(array, predicate) - возвращает последний объект, который удовлетворяет предикату&lt;br /&gt;
 - count(array[, predicate]) - возвращает число объектов, удовлетворяющих предикату&lt;br /&gt;
 - first(array) - первый объект из массива&lt;br /&gt;
 - last(array) - последний объект из массива&amp;lt;/code&amp;gt;&lt;br /&gt;
Примеры:&lt;br /&gt;
     &amp;lt;code&amp;gt;all(tweets, {.Size &amp;lt; 280})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;any(tweets, {.Size &amp;gt; 280})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;none(tweets, {.Size &amp;gt; 280})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;find([1, 2, 3, 4], # &amp;gt; 2) == 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;findLast([1, 2, 3, 4], # &amp;gt; 2) == 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;count(users, .Age &amp;gt; 18)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;first([1, 2, 3]) == 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;code&amp;gt;last([1, 2, 3]) == 3&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Image-afilters-prop.png&amp;diff=3385</id>
		<title>File:Image-afilters-prop.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Image-afilters-prop.png&amp;diff=3385"/>
		<updated>2025-11-27T09:35:33Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;afilters location&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3384</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3384"/>
		<updated>2025-11-27T09:25:11Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Расширенные параметры настройки сервера */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При импорте результатов на сервер индексация идет в фоновой задачи. Появление новых данных в результатах поиска может занять некоторое время.&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
&lt;br /&gt;
=== Переменные окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TAIL_LOG_SIZE&amp;lt;/code&amp;gt;&lt;br /&gt;
|1Мб&lt;br /&gt;
|Число. Размер буффера для показа лога сервера в WEB. Показывается последние SVACER_TAIL_LOG_SIZE байт из лога. &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_LOG_FORMAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;пусто&amp;gt;&lt;br /&gt;
|При указании формата json вывод формат лога заменяется на JSON. Предназначено для интеграции с агрегаторами логов. Так же можно указать через флаг при старте&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server --log-format=json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_INV_GEN_JOBS&amp;lt;/code&amp;gt;&lt;br /&gt;
|0.7 * runtime.GOMAXPROCS&lt;br /&gt;
|Максимальное число параллельных job-ов для генерации инвариантов при миграции старой базы или импорте результатов. &lt;br /&gt;
При ограниченных ресурсах сервера устанавливать в значение 1 или 2.  Пользователь не может увеличить больше, чем GOMAXPROCS&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Пересчет инвариантов ===&lt;br /&gt;
При миграции со старых версий иногда могут быть проблемы с переносом разметки. Для принудительного пересчета инвариантов пользователь может запустить сервер с опцией &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Объектное хранилище ===&lt;br /&gt;
При больших размерах объектного хранилища (object store) пользователь может запустить сервер с параметром &amp;lt;code&amp;gt;--compact-object-store&amp;lt;/code&amp;gt; - это приведет к поиску недостижимых объектов в объектном хранилище и сокращении размера базы. Операция может занять продолжительное время.&lt;br /&gt;
&lt;br /&gt;
'''ЭКСПЕРИМЕНТАЛЬНО''': Для быстрого получения копии текущего объектного хранилища пользователь может использовать CLI команду &lt;br /&gt;
 svacer server backup --host &amp;lt;nowiki&amp;gt;http://localhost:8080&amp;lt;/nowiki&amp;gt; --user admin --password &amp;lt;admin pwd&amp;gt; --checkpoint &amp;lt;path&amp;gt;&lt;br /&gt;
Данная команда создаст по пути ''&amp;lt;path&amp;gt;'' на '''хосте, где работает сервер''',  копию object store. При создании копии по возможности используются hard link-и, для ускорения процесса. Процесс работает в background-е и можно запускать для работающего сервера.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3383</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3383"/>
		<updated>2025-11-27T09:12:04Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров под id и инварианту.&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления (должно снизить использование памяти при импорте)&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера, показываемого в WEB интерфейсе, ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл не ограничивается в размерах и кнопка выгрузки лога выгружает полный лог. &lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* ['''Экспериментально''']  Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3382</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3382"/>
		<updated>2025-11-27T08:46:36Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров под id и инварианту.&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления (должно снизить использование памяти при импорте)&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3381</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3381"/>
		<updated>2025-11-26T11:04:38Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Полнотекстовый поиск */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При импорте результатов на сервер индексация идет в фоновой задачи. Появление новых данных в результатах поиска может занять некоторое время.&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TAIL_LOG_SIZE&amp;lt;/code&amp;gt;&lt;br /&gt;
|1Мб&lt;br /&gt;
|Число. Размер буффера для показа лога сервера в WEB. Показывается последние SVACER_TAIL_LOG_SIZE байт из лога. &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_LOG_FORMAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;пусто&amp;gt;&lt;br /&gt;
|При указании формата json вывод формат лога заменяется на JSON. Предназначено для интеграции с агрегаторами логов. Так же можно указать через флаг при старте&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server --log-format=json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_INV_GEN_JOBS&amp;lt;/code&amp;gt;&lt;br /&gt;
|0.7 * runtime.GOMAXPROCS&lt;br /&gt;
|Максимальное число параллельных job-ов для генерации инвариантов при миграции старой базы или импорте результатов. &lt;br /&gt;
При ограниченных ресурсах сервера устанавливать в значение 1 или 2.  Пользователь не может увеличить больше, чем GOMAXPROCS&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3380</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3380"/>
		<updated>2025-11-26T11:02:24Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3376</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3376"/>
		<updated>2025-11-26T10:32:24Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Расширенные параметры настройки сервера */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TAIL_LOG_SIZE&amp;lt;/code&amp;gt;&lt;br /&gt;
|1Мб&lt;br /&gt;
|Число. Размер буффера для показа лога сервера в WEB. Показывается последние SVACER_TAIL_LOG_SIZE байт из лога. &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_LOG_FORMAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;пусто&amp;gt;&lt;br /&gt;
|При указании формата json вывод формат лога заменяется на JSON. Предназначено для интеграции с агрегаторами логов. Так же можно указать через флаг при старте&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server --log-format=json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_INV_GEN_JOBS&amp;lt;/code&amp;gt;&lt;br /&gt;
|0.7 * runtime.GOMAXPROCS&lt;br /&gt;
|Максимальное число параллельных job-ов для генерации инвариантов при миграции старой базы или импорте результатов. &lt;br /&gt;
При ограниченных ресурсах сервера устанавливать в значение 1 или 2.  Пользователь не может увеличить больше, чем GOMAXPROCS&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3375</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3375"/>
		<updated>2025-11-26T10:32:02Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Расширенные параметры настройки сервера */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TAIL_LOG_SIZE&lt;br /&gt;
|1Мб&lt;br /&gt;
|Число. Размер буффера для показа лога сервера в WEB. Показывается последние SVACER_TAIL_LOG_SIZE байт из лога. &lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOG_FORMAT&lt;br /&gt;
|&amp;lt;пусто&amp;gt;&lt;br /&gt;
|При указании формата json вывод формат лога заменяется на JSON. Предназначено для интеграции с агрегаторами логов. Так же можно указать через флаг при старте&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server --log-format=json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_INV_GEN_JOBS &lt;br /&gt;
|0.7 * runtime.GOMAXPROCS&lt;br /&gt;
|Максимальное число параллельных job-ов для генерации инвариантов при миграции старой базы или импорте результатов. &lt;br /&gt;
При ограниченных ресурсах сервера устанавливать в значение 1 или 2.  Пользователь не может увеличить больше, чем GOMAXPROCS&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3373</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3373"/>
		<updated>2025-11-26T10:02:41Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: More env variables (in-progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3372</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3372"/>
		<updated>2025-11-26T08:28:57Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3371</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3371"/>
		<updated>2025-11-26T07:37:35Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3370</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3370"/>
		<updated>2025-11-26T07:24:20Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3369</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3369"/>
		<updated>2025-11-26T07:16:25Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3368</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3368"/>
		<updated>2025-11-26T07:15:31Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен Release 11-2-0&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3367</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3367"/>
		<updated>2025-11-26T05:25:54Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Обновление для 12-0-0 (in progress)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3363</id>
		<title>Edit markers (command line)</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3363"/>
		<updated>2025-11-25T06:46:29Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: Added experimental tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обзор [ВНИМАНИЕ: экспериментальная функциональность] ==&lt;br /&gt;
Функциональность '''edit-markers''' позволяет автоматически обрабатывать маркеры при импорте данных с помощью правил, заданных в JSON-файле. Поддерживаются три типа операций:&lt;br /&gt;
&lt;br /&gt;
* '''skip''' — пропуск (удаление) маркеров, соответствующих условию&lt;br /&gt;
* '''change''' — изменение полей маркеров&lt;br /&gt;
* '''deduplicate''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяются уникальные трассы и остается только один маркер с наименьшим порядковым номером предупреждения (local_id) в файле результатов анализа. Остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте. &lt;br /&gt;
&lt;br /&gt;
Данный функционал работает со снимками, созданными Svacer версии 7-0-0 и новее. Если у вас более старый снимок, то импортируйте и экспортируйте его для возможности работы с edit-markers.&lt;br /&gt;
&lt;br /&gt;
== Использование ==&lt;br /&gt;
&lt;br /&gt;
=== Импорт результатов Svace ===&lt;br /&gt;
&amp;lt;code&amp;gt;svacer import --edit-markers &amp;lt;файл_правил.json&amp;gt; [другие опции]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Применяет правила редактирования к маркерам при импорте результатов анализа Svace.&lt;br /&gt;
&lt;br /&gt;
=== Импорт SARIF ===&lt;br /&gt;
&amp;lt;code&amp;gt;svacer sarif2 import --edit-markers &amp;lt;файл_правил.json&amp;gt; [другие опции]&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Применяет правила при импорте SARIF-файлов.&lt;br /&gt;
&lt;br /&gt;
=== Импорт снимка с редактированием ===&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server import --edit-markers &amp;lt;файл_правил.json&amp;gt; [другие опции]&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Применяет правила к снимку при импорте. Дополнительно можно сохранить отредактированный снимок:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server import --edit-markers rules.json --save-edited-snapshot edited_snapshot.snap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Формат файла правил ==&lt;br /&gt;
Правила задаются в виде JSON-файла, содержащего массив объектов правил:&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;тип_действия&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;условие_или_список_полей&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: { /* только для action: &amp;quot;change&amp;quot; */ }&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
=== Типы действий ===&lt;br /&gt;
&lt;br /&gt;
==== skip — Пропуск маркеров ====&lt;br /&gt;
Удаляет маркеры, соответствующие условию.&lt;br /&gt;
 ...&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
   &amp;quot;rules&amp;quot;: &amp;quot;file == 'test.cpp' and line &amp;gt; 100&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
==== change — Изменение маркеров ====&lt;br /&gt;
Изменяет указанные поля маркеров.&lt;br /&gt;
 ...&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
   &amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
   &amp;quot;change&amp;quot;: {&lt;br /&gt;
     &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
     &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
Доступные поля для изменения: &amp;lt;code&amp;gt;warnclass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;msg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;details&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;line&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== deduplicate — Дедупликация ====&lt;br /&gt;
Объединяет маркеры с одинаковыми значениями указанных полей. Один маркер выбирается случайно, все trace от остальных маркеров добавляются к нему.&lt;br /&gt;
 ...&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;deduplicate&amp;quot;,&lt;br /&gt;
  &amp;quot;rules&amp;quot;: &amp;quot;file,line,warnclass&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
Поля для группировки (можно указать от 1 до 8): &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;line&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnclass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;details&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доступные поля и операторы ==&lt;br /&gt;
&lt;br /&gt;
=== Поля маркеров ===&lt;br /&gt;
В условиях можно использовать следующие поля:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; — полный путь к файлу (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;line&amp;lt;/code&amp;gt; — номер строки (число)&lt;br /&gt;
* &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; — имя функции (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;warnclass&amp;lt;/code&amp;gt; — класс предупреждения (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt; — язык программирования (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; — инструмент анализа (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — ID типа маркера (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;msg&amp;lt;/code&amp;gt; — сообщение маркера (строка)&lt;br /&gt;
* &amp;lt;code&amp;gt;details&amp;lt;/code&amp;gt; — детали маркера (строка)&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; — равно, не равно&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;=&amp;lt;/code&amp;gt; — сравнение чисел&lt;br /&gt;
* &amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; — логические операторы&lt;br /&gt;
* &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; — логическое НЕ&lt;br /&gt;
* &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; — проверка вхождения в список (например: &amp;lt;code&amp;gt;warnclass in ['ERROR', 'WARNING']&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt; — проверка вхождения подстроки&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы со строками ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icontains(s, substring)&amp;lt;/code&amp;gt; — содержит подстроку (без учета регистра)&lt;br /&gt;
* &amp;lt;code&amp;gt;hasPrefix(s, prefix)&amp;lt;/code&amp;gt; — начинается с префикса&lt;br /&gt;
* &amp;lt;code&amp;gt;hasSuffix(s, suffix)&amp;lt;/code&amp;gt; — заканчивается суффиксом&lt;br /&gt;
* &amp;lt;code&amp;gt;equalsFold(a, b)&amp;lt;/code&amp;gt; — сравнение строк без учета регистра&lt;br /&gt;
* &amp;lt;code&amp;gt;lower(s)&amp;lt;/code&amp;gt; — преобразование в нижний регистр&lt;br /&gt;
* &amp;lt;code&amp;gt;upper(s)&amp;lt;/code&amp;gt; — преобразование в верхний регистр&lt;br /&gt;
* &amp;lt;code&amp;gt;trim(s)&amp;lt;/code&amp;gt; — удаление пробелов в начале и конце строки&lt;br /&gt;
* &amp;lt;code&amp;gt;replace(s, old, new)&amp;lt;/code&amp;gt; — замена всех вхождений подстроки&lt;br /&gt;
* &amp;lt;code&amp;gt;regex(s, pattern)&amp;lt;/code&amp;gt; — проверка соответствия регулярному выражению&lt;br /&gt;
* &amp;lt;code&amp;gt;nregex(s, pattern)&amp;lt;/code&amp;gt; — проверка НЕсоответствия регулярному выражению&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Часть примеров используют снимок [https://svacer.ispras.ru/mediawiki/images/6/66/Bash.zip bash]. Детекторы в данном снимке выглядят так:&lt;br /&gt;
[[File:Edit-markers-1.png|center|thumb|967x967px]]&lt;br /&gt;
&lt;br /&gt;
=== Пропуск файлов ===&lt;br /&gt;
В данном примере будут пропущены все файлы, которые находятся в папке &amp;lt;code&amp;gt;/.build/lib&amp;lt;/code&amp;gt;&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;file contains '/.build/lib'&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Сравнивая исходный снимок и снимок, где было применено edit-markers можно увидеть 215 пропущенных детекторов. Все они находятся в папке &amp;lt;code&amp;gt;/.build/lib&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Edit-markers-2.png|center|thumb|983x983px]]&lt;br /&gt;
Если необходимо указать название не зависимо от регистра, то можно использовать функцию &amp;lt;code&amp;gt;icontains&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[ { &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;, &amp;quot;rules&amp;quot;: &amp;quot;icontains(file, '/.build/lib')&amp;quot; } ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также после применения edit-markers в информации о снимке указывается, какие правила были применены&lt;br /&gt;
[[File:Edit-marker.png|center|thumb|971x971px]]&lt;br /&gt;
&lt;br /&gt;
=== Изменение класса предупреждений ===&lt;br /&gt;
При необходимости возможно изменение полей маркера. В данном примере изменим warnclass маркеров у которых в названии есть &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; и находящиеся после 1000 строки, но детектор &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; изменять не будем.&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass contains 'UNREACHABLE_CODE' and line &amp;gt; 1000&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;UNREACHABLE&amp;quot;,&lt;br /&gt;
      &amp;quot;msg&amp;quot;: &amp;quot;Изменено правилами edit markers&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
[[File:Edit-markers-3.png|center|thumb|955x955px]]&lt;br /&gt;
Указанные маркеры изменили свой детектор и описание. &lt;br /&gt;
&lt;br /&gt;
{{Note|text=Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.}}&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate).&lt;br /&gt;
Например, в снимке содержится множество одинаковых детекторов в одном файле на одной строке.&lt;br /&gt;
[[File:Edit-markers-dedup.png|center|thumb|933x933px]]&lt;br /&gt;
Применив следующее правило все маркеры, которые находятся в одном файле, с одним детектором и на одной строке объединятся в один: выберется один с наименьшим порядковым номером предупреждения в файле результатов анализа (local_id) и у него будет объединенные уникальные трассы всех остальных маркеров.&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;deduplicate&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;file,warnclass,line&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
[[File:Edit-markers-dedup2.png|center|thumb|948x948px]]&lt;br /&gt;
В данном примере у всех маркеров &amp;lt;code&amp;gt;UNUSED_FIELD&amp;lt;/code&amp;gt; на строке 11 в файле &amp;lt;code&amp;gt;AddInstruction.cs&amp;lt;/code&amp;gt; была трасса состоящая из трёх ролей: detected, info, Current function name. Роль detected полностью совпадала во всех маркерах, она была включена один раз, а все остальные роли добавились в объединенный маркер. Оставшиеся дублирующие маркеры были удалены.&lt;br /&gt;
&lt;br /&gt;
=== Комплексный пример ===&lt;br /&gt;
В данном примере пропускаются все маркеры, у которых инструмент равен &amp;lt;code&amp;gt;CSA&amp;lt;/code&amp;gt;, а маркеры, которые имеют детекторы &amp;lt;code&amp;gt;'BAD_COPY_PASTE', 'DEREF_AFTER_NULL', 'UNUSED_VALUE'&amp;lt;/code&amp;gt; или имеют в описании подстроку &amp;lt;code&amp;gt;unsafe&amp;lt;/code&amp;gt; в любом регистре, меняют детектор и описание.&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;tool == 'CSA'&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass in ['BAD_COPY_PASTE', 'DEREF_AFTER_NULL', 'UNUSED_VALUE'] or icontains(msg, 'unsafe')&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;HIGH_PRIORITY&amp;quot;,&lt;br /&gt;
      &amp;quot;msg&amp;quot;: &amp;quot;Высокоприоритетное предупреждение&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
При сравнении с исходным снимком можно заметить, что 91 предупреждение, у которых инструмент был &amp;lt;code&amp;gt;CSA&amp;lt;/code&amp;gt;, удалены из измененного снимка.&lt;br /&gt;
[[File:Edit-markers-5.png|center|thumb|979x979px]]&lt;br /&gt;
Также были изменены маркеры, в соответствии с правилами.&lt;br /&gt;
[[File:Edit-markers-51.png|center|thumb|980x980px]]&lt;br /&gt;
&lt;br /&gt;
=== Изменение приоритета для определенных классов ===&lt;br /&gt;
Изменение детекторов:&lt;br /&gt;
 [ &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass in ['UNREACHABLE_CODE.TERMINATION', 'UNREACHABLE_CODE.RET', 'UNREACHABLE_CODE.ENUM']&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;UNREACHABLE_CODE&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
=== Обработка сгенерированных файлов ===&lt;br /&gt;
Пропускаем все маркеры в сгенерированных файлах:&lt;br /&gt;
&lt;br /&gt;
 [ &lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;file contains 'generated' or hasPrefix(file, 'vendor/')&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
=== Дедупликация с последующей фильтрацией ===&lt;br /&gt;
Сначала объединяем дубликаты, потом удаляем ненужные:&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;deduplicate&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;file,line,warnclass,function&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;icontains(file, 'third_party') or icontains(file, 'external')&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
=== Работа с регулярными выражениями ===&lt;br /&gt;
В данном примере будут пропущены маркеры, путь к файлу которых НЕ соответствует регулярному выражению. В результате в снимке останутся только маркеры из файлов с расширениями &amp;lt;code&amp;gt;.c&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.cpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.h&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;.hpp&amp;lt;/code&amp;gt;, находящихся в директории &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt;. В данном случае мы дважды экранируем: сначала слэш, а потом точку.&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;nregex(file, \&amp;quot;^/\\\\.build/builtins/.*\\\\.(c|cpp|h|hpp)$\&amp;quot;)&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
В результате у нас остаются только подходящие маркеры:&lt;br /&gt;
[[File:Edit-markers-8.png|center|thumb|979x979px]]&lt;br /&gt;
&lt;br /&gt;
== Дополнительные опции ==&lt;br /&gt;
&lt;br /&gt;
=== Сохранение отредактированного снимка ===&lt;br /&gt;
При импорте снимка можно сохранить результат применения правил:&lt;br /&gt;
  svacer server import --edit-markers rules.json --save-edited-snapshot result.snap ...&lt;br /&gt;
Обязательно должно быть расширение &amp;lt;code&amp;gt;.snap&amp;lt;/code&amp;gt; для сохранения.&lt;br /&gt;
&lt;br /&gt;
== Важные замечания ==&lt;br /&gt;
&lt;br /&gt;
# '''Порядок правил''' — правила применяются последовательно в порядке их описания в файле&lt;br /&gt;
# '''Валидация''' — при загрузке правил проверяется корректность JSON и соответствие полей&lt;br /&gt;
# '''Формат файла''' — файл правил должен иметь расширение &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Логирование''' — результат применения правил выводится в лог (количество обработанных и удаленных маркеров)&lt;br /&gt;
# '''Поле line в change''' — должно быть строкой с неотрицательным числом&lt;br /&gt;
# '''Поле warnclass в change''' — может принимать только русские и английские буквы, цифры, а также специальные символы, которые находятся на цифровой панели клавиатуры (и печатаются через Shift)&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3077</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3077"/>
		<updated>2025-09-15T04:41:31Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */ новая версия&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-09-15@04:26:40.654d90f2&lt;br /&gt;
|&lt;br /&gt;
* добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-invariants&amp;lt;/code&amp;gt;  - для дублей инвариантов&lt;br /&gt;
* добавлен флаг &amp;lt;code&amp;gt;--autofix-all&amp;lt;/code&amp;gt; - для дублей комментариев, инвариантов и потенциально иных проблем&lt;br /&gt;
* добавлена команда &amp;lt;code&amp;gt;safe-copy&amp;lt;/code&amp;gt;для копирования разметки между бранчами с автоисправлением дублей комментариев и инвариантов&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
Файл с тремя предикатами, для случая изменения версий go модулей в пакете go-jmespath (&amp;lt;code&amp;gt;jmespath -&amp;gt; go-jmespath&amp;lt;/code&amp;gt;)&lt;br /&gt;
 // common case for function changes&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go-jmespath case&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line, details)&lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go mod versions&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         same_go_path() &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Match&amp;diff=3072</id>
		<title>Help:Match</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Match&amp;diff=3072"/>
		<updated>2025-09-05T10:00:05Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Классический режим генерации инвариантов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cопоставления предупреждений ==&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
В данной секции описывается алгоритм сопоставления предупреждений используемый Svacer для переноса разметки.&lt;br /&gt;
&lt;br /&gt;
Для каждого предупреждения в снимке (snapshot) вычисляется хэшкод из полей предупреждения и исходных файлов. В терминологии Svacer хэшкод именуется '''инвариантом'''. Инвариант используется для группировки предупреждений из разных снимков в рамках одной ветки. Каждое предупреждение в рамках '''одного снимка''' имеет '''уникальный''' инвариант.&lt;br /&gt;
&lt;br /&gt;
Генерация инвариантов для снимка идет по следующему алгоритму:&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (формируем первый, основной инвариант):&lt;br /&gt;
&lt;br /&gt;
* Пути всех файлов из предупреждений в снимке сортируются лексикографически.&lt;br /&gt;
* Для каждого пути вычисляется минимально возможный не конфликтующий суффикс пути (т. е. конец пути содержащий имя файла), имеющий по крайней мере два сегмента (т. е. включающий имя директории). Для Java файлов минимальный путь учитывает имя пакета, объявленного внутри файла (при наличии package declaration внутри). Данный минимальный суффикс добавляется в хэш код инварианта.&lt;br /&gt;
* В инвариант добавляются хэш коды следующих полей предупреждения: '''MTid''' (если поле пустое, то используются поля '''Msg''', '''warnClass'''), '''Function''', '''Lang''', '''Tool'''. Поля '''Lang''' и '''Tool''' нормализуются, т. к. разные версии Svace могли иметь отличные именования полей.&lt;br /&gt;
* Формируется хэш-код строки кода из объекта сборки. При формировании хэшкода строки все whitespace-ы игнорируются. Если объект сборки отсутствует, то используется поле '''details'''  у предупреждения.&lt;br /&gt;
* Если для нескольких предупреждений в снимке получился одинаковый инвариант, то конфликтующие предупреждения упорядочиваются по '''line''' и '''locID''' предупреждения (порядковый номер предупреждения в svres или sarif файле, в данном случае полагаемся на детерминизм анализатора). В инвариант добавляется индекс предупреждения в данной конфликтной группе. Таким образом получаем уникальный инвариант для каждого предупреждения в снимке.&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (формируем второй инвариант):&lt;br /&gt;
&lt;br /&gt;
* Пути всех файлов в снимке сортируются лексикографически.&lt;br /&gt;
* Для каждого пути вычисляется минимально возможный не конфликтующий путь, содержащий по крайней мере два сегмента (т. е. включающий имя директории). Для Java файлов минимальный путь учитывает имя пакета, объявленного внутри файла (при наличии package declaration внутри). Минимальный путь добавляется в хэш код инварианта.&lt;br /&gt;
* В инвариант добавляются хэш коды следующих полей предупреждения: '''MTid''' (если поле пустое, то используется поля '''Msg''', '''warnClass'''), '''Function''', '''Lang''', '''Tool''', '''Details''' (важное отличие от ''шага 1'' — здесь используется поле '''Details''' у предупреждения). Поля '''Lang''' и '''Tool''' нормализуются, т. к. разные версии Svace могли иметь отличные именования полей.&lt;br /&gt;
* Предупреждения в снимке делятся на группы по инварианту. В рамках одной группы предупреждения сортируются по '''Function''', строке ('''line''') и '''locID'''. Индекс предупреждения в группе добавляется к инварианту группы. Таким образом получаем уникальный инвариант для каждого предупреждения в снимке.&lt;br /&gt;
&lt;br /&gt;
Шаг 3:&lt;br /&gt;
&lt;br /&gt;
* Если предупреждения на ветке (branch) попали согласно ''инварианту 1'' в разные группы, а ''инварианту 2'' в одну, то для данных предупреждений будет использован ''инвариант 2'', как более строгий. &lt;br /&gt;
&lt;br /&gt;
Шаг 4:&lt;br /&gt;
&lt;br /&gt;
* Проверяется, были ли ручные сопоставления предупреждений на ветке (branch) и инварианты корректируются исходя из таблицы ручных сопоставлений. При ручном сопоставлении предупреждениям назначается уникальный инвариант и запоминается информация об эквивалентности назначенного инварианта инвариантам полученным на шагах 1 и 2.&lt;br /&gt;
&lt;br /&gt;
==== Правила нормализации полей Lang и Tool при импорте *.svres файлов ====&lt;br /&gt;
Для поля Lang выполняются следующие преобразования (ключ сравнивается как case-insensitive)&lt;br /&gt;
 		&amp;quot;C_Cpp&amp;quot;:       &amp;quot;CXX&amp;quot;,&lt;br /&gt;
 		&amp;quot;C&amp;quot;:           &amp;quot;CXX&amp;quot;,&lt;br /&gt;
 		&amp;quot;C#&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;KOTLIN&amp;quot;:      &amp;quot;KOTLIN&amp;quot;,&lt;br /&gt;
 		&amp;quot;cs&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;CS&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;Python&amp;quot;:      &amp;quot;PYTHON&amp;quot;,&lt;br /&gt;
 		&amp;quot;Go&amp;quot;:          &amp;quot;GO&amp;quot;,&lt;br /&gt;
 		&amp;quot;go&amp;quot;:          &amp;quot;GO&amp;quot;,&lt;br /&gt;
 		&amp;quot;Java&amp;quot;:        &amp;quot;JAVA&amp;quot;,&lt;br /&gt;
 		&amp;quot;VisualBasic&amp;quot;: &amp;quot;VISUALBASIC&amp;quot;,&lt;br /&gt;
 		&amp;quot;VB&amp;quot;:          &amp;quot;VISUALBASIC&amp;quot;,&lt;br /&gt;
 		&amp;quot;JS&amp;quot;:          &amp;quot;JAVASCRIPT&amp;quot;,&lt;br /&gt;
Поле Tool нормализуется к значениям из следующего списка посредством case-insensitive сравнения (если значение не из списка, то не меняется)&lt;br /&gt;
 	&amp;quot;SvEng&amp;quot;&lt;br /&gt;
 	&amp;quot;SvCpp&amp;quot;&lt;br /&gt;
 	&amp;quot;CSA&amp;quot;&lt;br /&gt;
 	&amp;quot;SpotBugs&amp;quot;&lt;br /&gt;
 	&amp;quot;TagsJavac&amp;quot;&lt;br /&gt;
 	&amp;quot;Roslyn&amp;quot;&lt;br /&gt;
 	&amp;quot;Kotlinc&amp;quot;&lt;br /&gt;
При импорте детекторов из sarif или искусственно созданном svres файле нормализация значения Tool не делается.&lt;br /&gt;
&lt;br /&gt;
=== Опции сервера, влияющие на алгоритм генерации инвариантов ===&lt;br /&gt;
&lt;br /&gt;
==== Классический режим генерации инвариантов ====&lt;br /&gt;
Для включения режима сопоставления используемого в релизах 8 и ранее можно использовать опцию &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server run --classic-inv-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
либо определить переменную &amp;lt;code&amp;gt;SVACER_CLASSIC_INV_MODE=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При использовании данного режима перенос разметки и поведение опций по &amp;lt;code&amp;gt;quality gate&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;quick stats&amp;lt;/code&amp;gt;будет более детерменировано, т.к генерация инвариантов не использует информацию об уже содержащихся снимках на ветке.&lt;br /&gt;
&lt;br /&gt;
'''ВНИМАНИЕ''': измениие алгоритма генерации инвариантов приведет к пересчету всех инвариантов на сервере. Это может занять время. Рекомендуется сделать бэкап базы перед изменением опций.&lt;br /&gt;
&lt;br /&gt;
==== Отключение миграции инвариантов ====&lt;br /&gt;
Для отключения операции по пересчету и миграции инвариантов при старте можно использовать переменную окружения &lt;br /&gt;
 SVACER_NO_INVARIANT_MIGRATION=true&lt;br /&gt;
&lt;br /&gt;
При запуске сервера с данной опцией пересчет инвариантов происходить не будет.&lt;br /&gt;
&lt;br /&gt;
==== Отключение минимизации путей ====&lt;br /&gt;
При использовании следующей опции или соответствующей переменной окружения, механизм минимизации путей будет отключен.&lt;br /&gt;
 --no-path-min&lt;br /&gt;
&lt;br /&gt;
Переменная окружения:&lt;br /&gt;
 SVACER_NO_PATH_MIN=true|false&lt;br /&gt;
&lt;br /&gt;
==== Отключение шагов 2, 3 ====&lt;br /&gt;
Для отключения шагов 2 и 3 необходимо использовать переменную окружения&lt;br /&gt;
 SVACER_NO_MATCH_BY_CORE=true&lt;br /&gt;
{{Note}} Данная опция не рекомендуется, т. к. нарушает совместимость с алгоритмом генерации, используемом в прежних версиях Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Ручное сопоставление предупреждений (экспериментальная возможность) ===&lt;br /&gt;
Пользователь может выполнить ручное сопоставление предупреждений из [[Help:UI manual#Сопоставление маркеров|веб-интерфейса]] и CLI. В данной секции описывается механизм ручного сопоставления из CLI. &lt;br /&gt;
&lt;br /&gt;
Для ручного сопоставления предупреждений из CLI пользователь должен использовать команду &amp;lt;code&amp;gt;svacer marker match&amp;lt;/code&amp;gt;. Команда требует обязательной аутентификации и пользователь должен иметь права на разметку в проекте и ветке, где хочет выполнить сопоставление. Сопоставить можно предупреждения из '''разных''' снимков '''одной''' ветки. При ручном сопоставлении все предупреждения, которые эквивалентны по инвариантам первому предупреждению или второму, будут автоматически считаться эквивалентными. Одно и то же предупреждение может быть сопоставлено с множеством других предупреждений, но каждое из выбранных предупреждений должно находиться в различных снимках. Нельзя сопоставить два или более предупреждений из одного снимка одному предупреждению из другого снимка.&lt;br /&gt;
&lt;br /&gt;
 svacer marker match --user user --password password --host host --project project --branch branch --v1 snapshot1 --v2 snapshot2 id11=id21  id12=id22 id13=id23&lt;br /&gt;
 &lt;br /&gt;
Под аргументами операции подразумеваются пары ID маркеров из снимков указанных в параметрах &amp;lt;code&amp;gt;--v1&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;--v2&amp;lt;/code&amp;gt;. Для удобства пользователя, можно использовать числовой ID маркера, который может быть получен через CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password pwd --project project&lt;br /&gt;
&lt;br /&gt;
Формат задается опцией &amp;lt;code&amp;gt;--out-format=json|txt|csv&amp;lt;/code&amp;gt;. Если формат по умолчанию (txt), то данная команда выдает список предупреждений в виде таблицы&lt;br /&gt;
&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.&lt;br /&gt;
При указании опции &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; вывод будет направлен в указанный файл. &lt;br /&gt;
&lt;br /&gt;
В таблице первая колонка содержит числовой ID предупреждения, который может быть использован для сопоставления предупреждений. &lt;br /&gt;
&lt;br /&gt;
При использовании команды &amp;lt;code&amp;gt;svacer marker match&amp;lt;/code&amp;gt; пользователь может указывать как имя проекта и ветки, так и их ID.&lt;br /&gt;
&lt;br /&gt;
Для получения списка ручных сопоставлений пользователь должен использовать команду &amp;lt;code&amp;gt;svacer marker match-journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 svacer marker match-journal --host host --user user --password password --project project --branch branch&lt;br /&gt;
&lt;br /&gt;
Формат вывода контролируется опцией &amp;lt;code&amp;gt;--out-format&amp;lt;/code&amp;gt; и может быть &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt;, текст (&amp;lt;code&amp;gt;txt&amp;lt;/code&amp;gt;, default), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;. При указании опции &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; вывод будет направлен в указанный файл. &lt;br /&gt;
&lt;br /&gt;
 #  v   marker                        snapshot_id                           snapshot_name  created_by  create_ts&lt;br /&gt;
 2  v1  DEREF_OF_NULL.CONST:test.c:9  b51009b6-cdbe-463a-b324-c87143bb0372  S3             admin       Fri Mar 22 08:16:03 UTC 2024&lt;br /&gt;
    v2  DEREF_OF_NULL.CONST:test.c:8  8a9c4330-c131-44e1-bf09-b1d3a245b317  S1&lt;br /&gt;
 1  v1  DEREF_OF_NULL.CONST:test.c:8  3c20cd4e-e5d9-479b-b618-7db852ed0133  S2             admin       Fri Mar 22 08:01:06 UTC 2024&lt;br /&gt;
    v2  DEREF_OF_NULL.CONST:test.c:8  8a9c4330-c131-44e1-bf09-b1d3a245b317  S1&lt;br /&gt;
&lt;br /&gt;
Для отмены ручных сопоставлений пользователь должен использовать команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker unapply-match --host host --user user --password password --project project --branch branch id1 id2 id2 ...&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;code&amp;gt;id1, id2, ...&amp;lt;/code&amp;gt; — список id операций полученных командой &amp;lt;code&amp;gt;svacer marker match-journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} При отмене ручных сопоставлений вычисляется замыкание всех связанных сопоставлений и, далее, отменяется всё замыкание. Таким образом, если пользователь сопоставил два предупреждения, а потом одно из сопоставленных сопоставил с еще одним новым предупреждением, то при отмене первой операции будет отменена и вторая.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Match&amp;diff=3071</id>
		<title>Help:Match</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Match&amp;diff=3071"/>
		<updated>2025-09-05T09:59:00Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Опции сервера, влияющие на алгоритм генерации инвариантов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cопоставления предупреждений ==&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
В данной секции описывается алгоритм сопоставления предупреждений используемый Svacer для переноса разметки.&lt;br /&gt;
&lt;br /&gt;
Для каждого предупреждения в снимке (snapshot) вычисляется хэшкод из полей предупреждения и исходных файлов. В терминологии Svacer хэшкод именуется '''инвариантом'''. Инвариант используется для группировки предупреждений из разных снимков в рамках одной ветки. Каждое предупреждение в рамках '''одного снимка''' имеет '''уникальный''' инвариант.&lt;br /&gt;
&lt;br /&gt;
Генерация инвариантов для снимка идет по следующему алгоритму:&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (формируем первый, основной инвариант):&lt;br /&gt;
&lt;br /&gt;
* Пути всех файлов из предупреждений в снимке сортируются лексикографически.&lt;br /&gt;
* Для каждого пути вычисляется минимально возможный не конфликтующий суффикс пути (т. е. конец пути содержащий имя файла), имеющий по крайней мере два сегмента (т. е. включающий имя директории). Для Java файлов минимальный путь учитывает имя пакета, объявленного внутри файла (при наличии package declaration внутри). Данный минимальный суффикс добавляется в хэш код инварианта.&lt;br /&gt;
* В инвариант добавляются хэш коды следующих полей предупреждения: '''MTid''' (если поле пустое, то используются поля '''Msg''', '''warnClass'''), '''Function''', '''Lang''', '''Tool'''. Поля '''Lang''' и '''Tool''' нормализуются, т. к. разные версии Svace могли иметь отличные именования полей.&lt;br /&gt;
* Формируется хэш-код строки кода из объекта сборки. При формировании хэшкода строки все whitespace-ы игнорируются. Если объект сборки отсутствует, то используется поле '''details'''  у предупреждения.&lt;br /&gt;
* Если для нескольких предупреждений в снимке получился одинаковый инвариант, то конфликтующие предупреждения упорядочиваются по '''line''' и '''locID''' предупреждения (порядковый номер предупреждения в svres или sarif файле, в данном случае полагаемся на детерминизм анализатора). В инвариант добавляется индекс предупреждения в данной конфликтной группе. Таким образом получаем уникальный инвариант для каждого предупреждения в снимке.&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (формируем второй инвариант):&lt;br /&gt;
&lt;br /&gt;
* Пути всех файлов в снимке сортируются лексикографически.&lt;br /&gt;
* Для каждого пути вычисляется минимально возможный не конфликтующий путь, содержащий по крайней мере два сегмента (т. е. включающий имя директории). Для Java файлов минимальный путь учитывает имя пакета, объявленного внутри файла (при наличии package declaration внутри). Минимальный путь добавляется в хэш код инварианта.&lt;br /&gt;
* В инвариант добавляются хэш коды следующих полей предупреждения: '''MTid''' (если поле пустое, то используется поля '''Msg''', '''warnClass'''), '''Function''', '''Lang''', '''Tool''', '''Details''' (важное отличие от ''шага 1'' — здесь используется поле '''Details''' у предупреждения). Поля '''Lang''' и '''Tool''' нормализуются, т. к. разные версии Svace могли иметь отличные именования полей.&lt;br /&gt;
* Предупреждения в снимке делятся на группы по инварианту. В рамках одной группы предупреждения сортируются по '''Function''', строке ('''line''') и '''locID'''. Индекс предупреждения в группе добавляется к инварианту группы. Таким образом получаем уникальный инвариант для каждого предупреждения в снимке.&lt;br /&gt;
&lt;br /&gt;
Шаг 3:&lt;br /&gt;
&lt;br /&gt;
* Если предупреждения на ветке (branch) попали согласно ''инварианту 1'' в разные группы, а ''инварианту 2'' в одну, то для данных предупреждений будет использован ''инвариант 2'', как более строгий. &lt;br /&gt;
&lt;br /&gt;
Шаг 4:&lt;br /&gt;
&lt;br /&gt;
* Проверяется, были ли ручные сопоставления предупреждений на ветке (branch) и инварианты корректируются исходя из таблицы ручных сопоставлений. При ручном сопоставлении предупреждениям назначается уникальный инвариант и запоминается информация об эквивалентности назначенного инварианта инвариантам полученным на шагах 1 и 2.&lt;br /&gt;
&lt;br /&gt;
==== Правила нормализации полей Lang и Tool при импорте *.svres файлов ====&lt;br /&gt;
Для поля Lang выполняются следующие преобразования (ключ сравнивается как case-insensitive)&lt;br /&gt;
 		&amp;quot;C_Cpp&amp;quot;:       &amp;quot;CXX&amp;quot;,&lt;br /&gt;
 		&amp;quot;C&amp;quot;:           &amp;quot;CXX&amp;quot;,&lt;br /&gt;
 		&amp;quot;C#&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;KOTLIN&amp;quot;:      &amp;quot;KOTLIN&amp;quot;,&lt;br /&gt;
 		&amp;quot;cs&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;CS&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;Python&amp;quot;:      &amp;quot;PYTHON&amp;quot;,&lt;br /&gt;
 		&amp;quot;Go&amp;quot;:          &amp;quot;GO&amp;quot;,&lt;br /&gt;
 		&amp;quot;go&amp;quot;:          &amp;quot;GO&amp;quot;,&lt;br /&gt;
 		&amp;quot;Java&amp;quot;:        &amp;quot;JAVA&amp;quot;,&lt;br /&gt;
 		&amp;quot;VisualBasic&amp;quot;: &amp;quot;VISUALBASIC&amp;quot;,&lt;br /&gt;
 		&amp;quot;VB&amp;quot;:          &amp;quot;VISUALBASIC&amp;quot;,&lt;br /&gt;
 		&amp;quot;JS&amp;quot;:          &amp;quot;JAVASCRIPT&amp;quot;,&lt;br /&gt;
Поле Tool нормализуется к значениям из следующего списка посредством case-insensitive сравнения (если значение не из списка, то не меняется)&lt;br /&gt;
 	&amp;quot;SvEng&amp;quot;&lt;br /&gt;
 	&amp;quot;SvCpp&amp;quot;&lt;br /&gt;
 	&amp;quot;CSA&amp;quot;&lt;br /&gt;
 	&amp;quot;SpotBugs&amp;quot;&lt;br /&gt;
 	&amp;quot;TagsJavac&amp;quot;&lt;br /&gt;
 	&amp;quot;Roslyn&amp;quot;&lt;br /&gt;
 	&amp;quot;Kotlinc&amp;quot;&lt;br /&gt;
При импорте детекторов из sarif или искусственно созданном svres файле нормализация значения Tool не делается.&lt;br /&gt;
&lt;br /&gt;
=== Опции сервера, влияющие на алгоритм генерации инвариантов ===&lt;br /&gt;
&lt;br /&gt;
==== Классический режим генерации инвариантов ====&lt;br /&gt;
Для включения режима сопоставления используемого в релизах 8 и ранее можно использовать опцию &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server run --classic-inv-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
либо определить переменную &amp;lt;code&amp;gt;SVACER_CLASSIC_INV_MODE=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При использовании данного режима перенос разметки и поведение опций по &amp;lt;code&amp;gt;quality gate&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;quick stats&amp;lt;/code&amp;gt;будет более детерменировано, т.к генерация инвариантов не использует информацию об уже содержащихся снимках на ветке.&lt;br /&gt;
&lt;br /&gt;
==== Отключение миграции инвариантов ====&lt;br /&gt;
Для отключения операции по пересчету и миграции инвариантов при старте можно использовать переменную окружения &lt;br /&gt;
 SVACER_NO_INVARIANT_MIGRATION=true&lt;br /&gt;
&lt;br /&gt;
При запуске сервера с данной опцией пересчет инвариантов происходить не будет.&lt;br /&gt;
&lt;br /&gt;
==== Отключение минимизации путей ====&lt;br /&gt;
При использовании следующей опции или соответствующей переменной окружения, механизм минимизации путей будет отключен.&lt;br /&gt;
 --no-path-min&lt;br /&gt;
&lt;br /&gt;
Переменная окружения:&lt;br /&gt;
 SVACER_NO_PATH_MIN=true|false&lt;br /&gt;
&lt;br /&gt;
==== Отключение шагов 2, 3 ====&lt;br /&gt;
Для отключения шагов 2 и 3 необходимо использовать переменную окружения&lt;br /&gt;
 SVACER_NO_MATCH_BY_CORE=true&lt;br /&gt;
{{Note}} Данная опция не рекомендуется, т. к. нарушает совместимость с алгоритмом генерации, используемом в прежних версиях Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Ручное сопоставление предупреждений (экспериментальная возможность) ===&lt;br /&gt;
Пользователь может выполнить ручное сопоставление предупреждений из [[Help:UI manual#Сопоставление маркеров|веб-интерфейса]] и CLI. В данной секции описывается механизм ручного сопоставления из CLI. &lt;br /&gt;
&lt;br /&gt;
Для ручного сопоставления предупреждений из CLI пользователь должен использовать команду &amp;lt;code&amp;gt;svacer marker match&amp;lt;/code&amp;gt;. Команда требует обязательной аутентификации и пользователь должен иметь права на разметку в проекте и ветке, где хочет выполнить сопоставление. Сопоставить можно предупреждения из '''разных''' снимков '''одной''' ветки. При ручном сопоставлении все предупреждения, которые эквивалентны по инвариантам первому предупреждению или второму, будут автоматически считаться эквивалентными. Одно и то же предупреждение может быть сопоставлено с множеством других предупреждений, но каждое из выбранных предупреждений должно находиться в различных снимках. Нельзя сопоставить два или более предупреждений из одного снимка одному предупреждению из другого снимка.&lt;br /&gt;
&lt;br /&gt;
 svacer marker match --user user --password password --host host --project project --branch branch --v1 snapshot1 --v2 snapshot2 id11=id21  id12=id22 id13=id23&lt;br /&gt;
 &lt;br /&gt;
Под аргументами операции подразумеваются пары ID маркеров из снимков указанных в параметрах &amp;lt;code&amp;gt;--v1&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;--v2&amp;lt;/code&amp;gt;. Для удобства пользователя, можно использовать числовой ID маркера, который может быть получен через CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password pwd --project project&lt;br /&gt;
&lt;br /&gt;
Формат задается опцией &amp;lt;code&amp;gt;--out-format=json|txt|csv&amp;lt;/code&amp;gt;. Если формат по умолчанию (txt), то данная команда выдает список предупреждений в виде таблицы&lt;br /&gt;
&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.&lt;br /&gt;
При указании опции &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; вывод будет направлен в указанный файл. &lt;br /&gt;
&lt;br /&gt;
В таблице первая колонка содержит числовой ID предупреждения, который может быть использован для сопоставления предупреждений. &lt;br /&gt;
&lt;br /&gt;
При использовании команды &amp;lt;code&amp;gt;svacer marker match&amp;lt;/code&amp;gt; пользователь может указывать как имя проекта и ветки, так и их ID.&lt;br /&gt;
&lt;br /&gt;
Для получения списка ручных сопоставлений пользователь должен использовать команду &amp;lt;code&amp;gt;svacer marker match-journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 svacer marker match-journal --host host --user user --password password --project project --branch branch&lt;br /&gt;
&lt;br /&gt;
Формат вывода контролируется опцией &amp;lt;code&amp;gt;--out-format&amp;lt;/code&amp;gt; и может быть &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt;, текст (&amp;lt;code&amp;gt;txt&amp;lt;/code&amp;gt;, default), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;. При указании опции &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; вывод будет направлен в указанный файл. &lt;br /&gt;
&lt;br /&gt;
 #  v   marker                        snapshot_id                           snapshot_name  created_by  create_ts&lt;br /&gt;
 2  v1  DEREF_OF_NULL.CONST:test.c:9  b51009b6-cdbe-463a-b324-c87143bb0372  S3             admin       Fri Mar 22 08:16:03 UTC 2024&lt;br /&gt;
    v2  DEREF_OF_NULL.CONST:test.c:8  8a9c4330-c131-44e1-bf09-b1d3a245b317  S1&lt;br /&gt;
 1  v1  DEREF_OF_NULL.CONST:test.c:8  3c20cd4e-e5d9-479b-b618-7db852ed0133  S2             admin       Fri Mar 22 08:01:06 UTC 2024&lt;br /&gt;
    v2  DEREF_OF_NULL.CONST:test.c:8  8a9c4330-c131-44e1-bf09-b1d3a245b317  S1&lt;br /&gt;
&lt;br /&gt;
Для отмены ручных сопоставлений пользователь должен использовать команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker unapply-match --host host --user user --password password --project project --branch branch id1 id2 id2 ...&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;code&amp;gt;id1, id2, ...&amp;lt;/code&amp;gt; — список id операций полученных командой &amp;lt;code&amp;gt;svacer marker match-journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} При отмене ручных сопоставлений вычисляется замыкание всех связанных сопоставлений и, далее, отменяется всё замыкание. Таким образом, если пользователь сопоставил два предупреждения, а потом одно из сопоставленных сопоставил с еще одним новым предупреждением, то при отмене первой операции будет отменена и вторая.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=3066</id>
		<title>Help:Utils</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=3066"/>
		<updated>2025-08-19T08:18:50Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Утилиты ==&lt;br /&gt;
=== pfixer ===&lt;br /&gt;
pfixer — утилита для исправления путей при экспорте снимков в файл. Замена путей в существующем снимке опасна, поэтому предлагается делать экспорт снимка с заменой путей. После, при необходимости, исходный снимок можно удалить с сервера. Утилита также работает со снимками в &amp;lt;code&amp;gt;.snap&amp;lt;/code&amp;gt; файлах. &lt;br /&gt;
&lt;br /&gt;
'''UPDATE''': начиная с версии &amp;lt;code&amp;gt;&amp;gt;=devel.2025-08-19&amp;lt;/code&amp;gt; включает флаг &amp;lt;code&amp;gt;--autofix&amp;lt;/code&amp;gt;   для исправления ряда проблем с дублями связей разметки и комментариев при импорте. Опцию можно использовать при обнаружении ошибок вида &amp;lt;code&amp;gt;ERROR: duplicate key value violates unique constraint &amp;quot;group_review_comments_idx_group_review_id&amp;quot;&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Поддерживаются версии Svacer, начиная с 7-0-0, но в дистрибутив утилита входит с версии 10-0-0. Актуальную версию можно [https://svacer.ispras.ru/releases/utils/pfixer скачать отсюда]&lt;br /&gt;
&lt;br /&gt;
Для работы с утилитой необходимо создать файл содержащий правила замены путей. Это должен быть юниксовый текстовый файл (разделитель строк &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;). Его можно указать через опцию &amp;lt;code&amp;gt;--map-file&amp;lt;/code&amp;gt; или через stdin. Каждая строчка должна содержать заменяемый префикс и значение, разделённые двоеточием. Если префикс должен быть удалён, для замены используется знак &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;префикс1&amp;gt;:&amp;lt;замена1&amp;gt;&lt;br /&gt;
 &amp;lt;префикс2&amp;gt;:&amp;lt;замена2&amp;gt;&lt;br /&gt;
 &amp;lt;префикс3&amp;gt;:&amp;lt;замена3&amp;gt;&lt;br /&gt;
 &amp;lt;префикс4&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
Также есть возможность использовать [https://pkg.go.dev/regexp#Regexp.ReplaceAllString регулярные выражения] (в экспериментальной стадии) из языка Go. В этом случае надо использовать знак '@' в начале строки. Можно использовать $var для ссылок на группы в регулярном выражении.&lt;br /&gt;
&lt;br /&gt;
 @&amp;lt;регулярное_выражение1&amp;gt;:&amp;lt;замена&amp;gt;&lt;br /&gt;
 @&amp;lt;регулярное_выражение2&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
Все правила упорядочиваются перед заменой, применяется самое длинное подходящее правило. Процесс прерывается в случае, если пути конфликтуют после замены (два пути превратились в один).&lt;br /&gt;
&lt;br /&gt;
Авторизацию на сервере можно передать через опции &amp;lt;code&amp;gt;--credentials &amp;lt;login:password&amp;gt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;--token &amp;lt;token&amp;gt;&amp;lt;/code&amp;gt; — сразу токен авторизации.&lt;br /&gt;
&lt;br /&gt;
Исходный снимок с сервера можно передать в виде URL.&lt;br /&gt;
&lt;br /&gt;
'''Примеры'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 pfixer --source http://svacer/mode/review/project/{project}/branch/{branch}/snapshot/{snapshot} --output updated.snap --credentials login:password --map-file map.txt&lt;br /&gt;
 pfixer --source input.snap --output updated.snap -map-file map.txt --log-file test.log&lt;br /&gt;
 pfixer --source input.snap --output updated.snap --log-file test.log | cat map.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reviewer ===&lt;br /&gt;
Утилита для репликации разметки по декларативно описанным правилам. &lt;br /&gt;
&lt;br /&gt;
Подробнее в отдельной статье: [[Review_replication]]&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=3065</id>
		<title>Help:Utils</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=3065"/>
		<updated>2025-08-19T08:13:51Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Утилиты ==&lt;br /&gt;
=== pfixer ===&lt;br /&gt;
pfixer — утилита для исправления путей при экспорте снимков в файл. Замена путей в существующем снимке опасна, поэтому предлагается делать экспорт снимка с заменой путей. После, при необходимости, исходный снимок можно удалить с сервера. Утилита также работает со снимками в &amp;lt;code&amp;gt;.snap&amp;lt;/code&amp;gt; файлах. &lt;br /&gt;
&lt;br /&gt;
'''UPDATE''': начиная с версии &amp;lt;code&amp;gt;devel.2025-08-19@10:36:31.e8cbf274&amp;lt;/code&amp;gt; включает флаг &amp;lt;code&amp;gt;--autofix&amp;lt;/code&amp;gt;   для исправления ряда проблем с дублями связей разметки и комментариев при импорте. Опцию можно использовать при обнаружении ошибок вида &amp;lt;code&amp;gt;ERROR: duplicate key value violates unique constraint &amp;quot;group_review_comments_idx_group_review_id&amp;quot;&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Поддерживаются версии Svacer, начиная с 7-0-0, но в дистрибутив утилита входит с версии 10-0-0. Актуальную версию можно [https://svacer.ispras.ru/releases/utils/pfixer скачать отсюда]&lt;br /&gt;
&lt;br /&gt;
Для работы с утилитой необходимо создать файл содержащий правила замены путей. Это должен быть юниксовый текстовый файл (разделитель строк &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;). Его можно указать через опцию &amp;lt;code&amp;gt;--map-file&amp;lt;/code&amp;gt; или через stdin. Каждая строчка должна содержать заменяемый префикс и значение, разделённые двоеточием. Если префикс должен быть удалён, для замены используется знак &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;префикс1&amp;gt;:&amp;lt;замена1&amp;gt;&lt;br /&gt;
 &amp;lt;префикс2&amp;gt;:&amp;lt;замена2&amp;gt;&lt;br /&gt;
 &amp;lt;префикс3&amp;gt;:&amp;lt;замена3&amp;gt;&lt;br /&gt;
 &amp;lt;префикс4&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
Также есть возможность использовать [https://pkg.go.dev/regexp#Regexp.ReplaceAllString регулярные выражения] (в экспериментальной стадии) из языка Go. В этом случае надо использовать знак '@' в начале строки. Можно использовать $var для ссылок на группы в регулярном выражении.&lt;br /&gt;
&lt;br /&gt;
 @&amp;lt;регулярное_выражение1&amp;gt;:&amp;lt;замена&amp;gt;&lt;br /&gt;
 @&amp;lt;регулярное_выражение2&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
Все правила упорядочиваются перед заменой, применяется самое длинное подходящее правило. Процесс прерывается в случае, если пути конфликтуют после замены (два пути превратились в один).&lt;br /&gt;
&lt;br /&gt;
Авторизацию на сервере можно передать через опции &amp;lt;code&amp;gt;--credentials &amp;lt;login:password&amp;gt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;--token &amp;lt;token&amp;gt;&amp;lt;/code&amp;gt; — сразу токен авторизации.&lt;br /&gt;
&lt;br /&gt;
Исходный снимок с сервера можно передать в виде URL.&lt;br /&gt;
&lt;br /&gt;
'''Примеры'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 pfixer --source http://svacer/mode/review/project/{project}/branch/{branch}/snapshot/{snapshot} --output updated.snap --credentials login:password --map-file map.txt&lt;br /&gt;
 pfixer --source input.snap --output updated.snap -map-file map.txt --log-file test.log&lt;br /&gt;
 pfixer --source input.snap --output updated.snap --log-file test.log | cat map.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reviewer ===&lt;br /&gt;
Утилита для репликации разметки по декларативно описанным правилам. &lt;br /&gt;
&lt;br /&gt;
Подробнее в отдельной статье: [[Review_replication]]&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3060</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3060"/>
		<updated>2025-07-25T05:28:08Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Пример предиката */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
Файл с тремя предикатами, для случая изменения версий go модулей в пакете go-jmespath (&amp;lt;code&amp;gt;jmespath -&amp;gt; go-jmespath&amp;lt;/code&amp;gt;)&lt;br /&gt;
 // common case for function changes&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go-jmespath case&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line, details)&lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go mod versions&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         same_go_path() &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3059</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3059"/>
		<updated>2025-07-25T05:25:41Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Пример предиката */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
Файл с тремя предикатами, для случая изменения версий go модулей в пакете go-jmespath&lt;br /&gt;
 // common case for function changes&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go-jmespath case&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line, details)&lt;br /&gt;
 ;;&lt;br /&gt;
 // handle go mod versions&lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp; &lt;br /&gt;
         match_loc(warnclass,lang,tool,mtid, line) &amp;amp;&amp;amp;&lt;br /&gt;
         match_source_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; match_target_re(lang, &amp;quot;GO|Go&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
         same_go_path() &amp;amp;&amp;amp;&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) &lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3058</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3058"/>
		<updated>2025-07-25T05:12:54Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, которые по какой-либо причине могут быть в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* В журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* Добавлены вспомогательные функции &amp;lt;code&amp;gt;source_review_ct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;target_review_ct&amp;lt;/code&amp;gt; для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* Добавлено ассоциирование комментария с разметкой при репликации&lt;br /&gt;
* Добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* Улучшено HTML-представление отчета&lt;br /&gt;
* Добавлен предикат &amp;lt;code&amp;gt;match_prefix_re&amp;lt;/code&amp;gt; по аналогии с &amp;lt;code&amp;gt;match_suffix_re&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты &amp;lt;code&amp;gt;same_go_path&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;match_go_path&amp;lt;/code&amp;gt; для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример предиката ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3055</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3055"/>
		<updated>2025-07-22T07:30:50Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 11-2-0 ===&lt;br /&gt;
&lt;br /&gt;
* Реализованы исправления связанные со случайными зависаниями сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir-ов и SARIF файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3050</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3050"/>
		<updated>2025-07-16T07:43:33Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-16@07:20:59.90a60fcd&lt;br /&gt;
|&lt;br /&gt;
* добавлен флаг &amp;lt;code&amp;gt;--autofix-duplicate-comments&amp;lt;/code&amp;gt;  для удаления дублей комментариев, какие могут быть по какой-либо причине в исходных данных&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* в журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* добавлены вспомогательные функции source_review_ct и target_review_ct для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* добавлено ассоциирования комментария с разметкой при репликации&lt;br /&gt;
* добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* улучшено HTML представление отчета&lt;br /&gt;
* добавлены предикат match_prefix_re по аналогии с match_suffix_re&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты same_go_path и match_go_path для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3049</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3049"/>
		<updated>2025-07-14T07:34:39Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */ fix version format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* в журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* добавлены вспомогательные функции source_review_ct и target_review_ct для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* добавлено ассоциирования комментария с разметкой при репликации&lt;br /&gt;
* добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* улучшено HTML представление отчета&lt;br /&gt;
* добавлены предикат match_prefix_re по аналогии с match_suffix_re&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты same_go_path и match_go_path для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3048</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3048"/>
		<updated>2025-07-14T07:34:11Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|reviewer version devel.2025-07-14@07:20:15.74259281&lt;br /&gt;
|&lt;br /&gt;
* в журнал операций добавлены old/new статусы при операции replicate&lt;br /&gt;
* добавлены вспомогательные функции source_review_ct и target_review_ct для получения времени разметки на source и target. Их можно использовать в предикатах&lt;br /&gt;
* добавлено ассоциирования комментария с разметкой при репликации&lt;br /&gt;
* добавлен ряд вспомогательных команд&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* улучшено HTML представление отчета&lt;br /&gt;
* добавлены предикат match_prefix_re по аналогии с match_suffix_re&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты same_go_path и match_go_path для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3046</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3046"/>
		<updated>2025-07-10T05:00:20Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: spell fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|type=warn|text='''Disclaimer'''&lt;br /&gt;
* Это экспериментальная Proof of Concept версия, предоставляемая для ознакомления по принципу &amp;quot;как есть&amp;quot;. &lt;br /&gt;
* Данная функциональность не связана с [https://svace.pages.ispras.ru/svace-website/2025/02/21/ai-assistant.html AI-ассистентом из анализатора Svace]. Функционал AI-ассистента из анализатора Svace будет интегрирован в Svacer в будущих версиях сервера.}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
=== Где посмотреть ===&lt;br /&gt;
* Развернуть у себя, воспользовавшись [[Help:XSvacer:AIAssistant:Deploy|инструкцией по запуску]].&lt;br /&gt;
* На нашем демо-стенде: https://svacer-ai-demo.ispras.ru (admin / admin).&amp;lt;br /&amp;gt;Сейчас это выглядит как отдельный урезанный интерфейс Svacer, но в следующих релизах будет встроено в основной UI.&lt;br /&gt;
&lt;br /&gt;
== Описание интерфейса ИИ-ассистента==&lt;br /&gt;
=== Разметка одного маркера ===&lt;br /&gt;
Чтобы разметить один маркер с помощью ИИ-ассистента:&lt;br /&gt;
:1. Нажмите кнопку [[File:Icon AI.png|25px]] [[Help:UI manual#Функции правой панели|на правой панели]] или в виджете маркера на [[Help:UI manual#Вкладка с исходным кодом|вкладке с исходным кодом]].&lt;br /&gt;
:[[File:221 Правая панель. Переход к ИИ-разметке.png|thumb|none|x200px|Правая панель. Переход к ИИ-разметке]]&lt;br /&gt;
:[[File:222 Виджет элемента трассы. Переход к ИИ-разметке.png|thumb|none|x150px|Виджет маркера на вкладке с исходным кодом. Переход к ИИ-разметке]]&lt;br /&gt;
:2. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированный статус и уровень доверия прогнозу отобразятся в этом же окне. &lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то в окне отобразится сообщение об этом и дальнейшая разметка станет недоступна.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Нажмите кнопку '''Применить'''.&lt;br /&gt;
:&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  223 Окно ИИ-разметки.png|Окно ИИ-разметки&lt;br /&gt;
  224 Окно ИИ-разметки. Статус совпадает.png|Окно ИИ-разметки. Прогнозный статус совпадает с существующим&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:Статус, установленный с помощью ИИ-ассистента, отобразится в верхней части правой панели и в виджете маркера на вкладке с исходным кодом с отметкой [[File:Icon AI 2.png|15px]]. Также этой иконкой будет отмечен статус в комментарии, добавленном при разметке, который дополнительно содержит информацию о проведенной разметке: время, имя модели машинного обучения, уровень доверия прогнозу.&lt;br /&gt;
:Дополнительная информация также отображается при наведении курсора на иконку [[File:Icon AI 2.png|15px]].&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  225 Правая панель. Результат ИИ-разметки.png|Правая панель. Результат ИИ-разметки&lt;br /&gt;
  227 Правая панель. Комментарий об ИИ-разметке.png|Правая панель. Комментарий об ИИ-разметке&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
[[File:226 Виджет элемента трассы. Результат ИИ-разметки.png|thumb|none|x150px|Виджет элемента трассы. Результат ИИ-разметки]]&lt;br /&gt;
&lt;br /&gt;
=== Групповая разметка маркеров ===&lt;br /&gt;
Чтобы разметить несколько маркеров с помощью ИИ-ассистента одновременно:&lt;br /&gt;
:1. Если планируется разметить большое количество маркеров, то для ускорения составления прогноза запустите предварительный рассчет (опционально) – на вкладке [[Help:UI manual#Вкладка «Информация о снимке»|'''Информация о снимке''']] [[Help:UI manual#Функции центральной панели|центральной панели]] нажмите кнопку '''Проанализировать с AI'''.&lt;br /&gt;
:Расчет прогнозируемого статуса для каждого маркера запустится в фоновом режиме. В это время на месте кнопки будет отображаться анимированная иконка ожидания.&lt;br /&gt;
:[[File:228 Информация о снимке. Предварительный расчет.png|thumb|none|x200px|Информация о снимке. Кнопка перехода к предварительному расчету статусов маркеров]]&lt;br /&gt;
:2. Выберите маркеры для разметки – установите флажки в строках [[Help:UI manual#Таблица маркеров|таблицы]].&lt;br /&gt;
:3. Нажмите кнопку [[File:Icon AI.png|25px]] (доступна, если выбраны маркеры в таблице).&lt;br /&gt;
:4. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированные статусы и уровни доверия прогнозу отобразятся в этом же окне в таблице маркеров. При этом размеченные ранее маркеры окрашены в цвет, соответствующий выставленному статусу. &lt;br /&gt;
::В таблице доступна сортировка значений в столбцах '''Детектор''', '''Файл''', '''Строка''' и '''Уровень доверия''', а в столбце '''Статус разметки''' доступна фильтрация по значению прогнозируемого статуса.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Выберите маркеры, которые требуется разметить, – установите флажки в столбце '''Статус разметки'''.&lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то он недоступен для установки флажка.&lt;br /&gt;
::г) Нажмите кнопку '''Применить'''.&lt;br /&gt;
:[[File:229 Окно групповой ИИ-разметки.png|thumb|none|x300px|Окно групповой ИИ-разметки]]&lt;br /&gt;
:Прогресс разметки отображается в соответствующем окне. Запущенный процесс можно полностью отменить нажатием кнопки '''Отмена'''.&lt;br /&gt;
:[[File:56 Окно прогресса разметки.png|thumb|none|x100px|Окно прогресса разметки]]&lt;br /&gt;
=== Фильтрация маркеров по режиму разметки ===&lt;br /&gt;
По умолчанию в [[Help:UI manual#Таблица маркеров|таблице маркеров]] отображаются все маркеры: как размеченные вручную, так и размеченные с помощью ИИ-ассистента.&lt;br /&gt;
Чтобы отобразить маркеры только с одним режимом разметки, воспользуйтесь [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательскими фильтрами]]:&lt;br /&gt;
* для отображения только маркеров, размеченных вручную, выберите фильтр '''Режим разметки''' – '''Вручную''';&lt;br /&gt;
* для отображения только маркеров, размеченных с помощью ИИ-ассистента, выберите фильтр '''Режим разметки''' – '''С помощью ИИ'''.&lt;br /&gt;
[[File:230 Пользовательские фильтры. Режимы разметки.png|thumb|none|x400px|Пользовательские фильтры. Режимы разметки]]&lt;br /&gt;
&lt;br /&gt;
== Описание модели xgb.joblib ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Модель обучена на базе 50000+ размеченных предупреждений.&lt;br /&gt;
&lt;br /&gt;
Для предсказания статуса разметки нами используются:&lt;br /&gt;
# языковая модель codebert-base для получения эмбеддингов кода;&lt;br /&gt;
# метод градиентного бустинга (xgboost) для решения задачи классификации.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3043</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3043"/>
		<updated>2025-07-09T04:36:57Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
'''Внимание''': данная функциональность не связана с функцией AI-ассистент из анализатора Svace https://svace.pages.ispras.ru/svace-website/2025/02/21/ai-assistant.html  . Функционал AI-ассистента из анализатора Svace будет интегрирован в Svacer в будущих версиях сервера. &lt;br /&gt;
&lt;br /&gt;
{{Note|text=[[Help:XSvacer:AIAssistant:Deploy|Инструкция по активации и запуску функциональности]] ИИ-ассистента Svacer}}&lt;br /&gt;
&lt;br /&gt;
Посмотреть, не разворачивая у себя, можно на нашем демо-стенде: https://svacer-ai-demo.ispras.ru (admin / admin).&lt;br /&gt;
&lt;br /&gt;
== Описание интерфейса ИИ-ассистента==&lt;br /&gt;
=== Разметка одного маркера ===&lt;br /&gt;
Чтобы разметить один маркер с помощью ИИ-ассистента:&lt;br /&gt;
:1. Нажмите кнопку [[File:Icon AI.png|25px]] [[Help:UI manual#Функции правой панели|на правой панели]] или в виджете маркера на [[Help:UI manual#Вкладка с исходным кодом|вкладке с исходным кодом]].&lt;br /&gt;
:[[File:221 Правая панель. Переход к ИИ-разметке.png|thumb|none|x200px|Правая панель. Переход к ИИ-разметке]]&lt;br /&gt;
:[[File:222 Виджет элемента трассы. Переход к ИИ-разметке.png|thumb|none|x150px|Виджет маркера на вкладке с исходным кодом. Переход к ИИ-разметке]]&lt;br /&gt;
:2. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированный статус и уровень доверия прогнозу отобразятся в этом же окне. &lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то в окне отобразится сообщение об этом и дальнейшая разметка станет недоступна.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Нажмите кнопку '''Применить'''.&lt;br /&gt;
:&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  223 Окно ИИ-разметки.png|Окно ИИ-разметки&lt;br /&gt;
  224 Окно ИИ-разметки. Статус совпадает.png|Окно ИИ-разметки. Прогнозный статус совпадает с существующим&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:Статус, установленный с помощью ИИ-ассистента, отобразится в верхней части правой панели и в виджете маркера на вкладке с исходным кодом с отметкой [[File:Icon AI 2.png|15px]]. Также этой иконкой будет отмечен статус в комментарии, добавленном при разметке, который дополнительно содержит информацию о проведенной разметке: время, имя модели машинного обучения, уровень доверия прогнозу.&lt;br /&gt;
:Дополнительная информация также отображается при наведении курсора на иконку [[File:Icon AI 2.png|15px]].&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  225 Правая панель. Результат ИИ-разметки.png|Правая панель. Результат ИИ-разметки&lt;br /&gt;
  227 Правая панель. Комментарий об ИИ-разметке.png|Правая панель. Комментарий об ИИ-разметке&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
[[File:226 Виджет элемента трассы. Результат ИИ-разметки.png|thumb|none|x150px|Виджет элемента трассы. Результат ИИ-разметки]]&lt;br /&gt;
&lt;br /&gt;
=== Групповая разметка маркеров ===&lt;br /&gt;
Чтобы разметить несколько маркеров с помощью ИИ-ассистента одновременно:&lt;br /&gt;
:1. Если планируется разметить большое количество маркеров, то для ускорения составления прогноза запустите предварительный рассчет (опционально) – на вкладке [[Help:UI manual#Вкладка «Информация о снимке»|'''Информация о снимке''']] [[Help:UI manual#Функции центральной панели|центральной панели]] нажмите кнопку '''Проанализировать с AI'''.&lt;br /&gt;
:Расчет прогнозируемого статуса для каждого маркера запустится в фоновом режиме. В это время на месте кнопки будет отображаться анимированная иконка ожидания.&lt;br /&gt;
:[[File:228 Информация о снимке. Предварительный расчет.png|thumb|none|x200px|Информация о снимке. Кнопка перехода к предварительному расчету статусов маркеров]]&lt;br /&gt;
:2. Выберите маркеры для разметки – установите флажки в строках [[Help:UI manual#Таблица маркеров|таблицы]].&lt;br /&gt;
:3. Нажмите кнопку [[File:Icon AI.png|25px]] (доступна, если выбраны маркеры в таблице).&lt;br /&gt;
:4. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированные статусы и уровни доверия прогнозу отобразятся в этом же окне в таблице маркеров. При этом размеченные ранее маркеры окрашены в цвет, соответствующий выставленному статусу. &lt;br /&gt;
::В таблице доступна сортировка значений в столбцах '''Детектор''', '''Файл''', '''Строка''' и '''Уровень доверия''', а в столбце '''Статус разметки''' доступна фильтрация по значению прогнозируемого статуса.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Выберите маркеры, которые требуется разметить, – установите флажки в столбце '''Статус разметки'''.&lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то он недоступен для установки флажка.&lt;br /&gt;
::г) Нажмите кнопку '''Применить'''.&lt;br /&gt;
:[[File:229 Окно групповой ИИ-разметки.png|thumb|none|x300px|Окно групповой ИИ-разметки]]&lt;br /&gt;
:Прогресс разметки отображается в соответствующем окне. Запущенный процесс можно полностью отменить нажатием кнопки '''Отмена'''.&lt;br /&gt;
:[[File:56 Окно прогресса разметки.png|thumb|none|x100px|Окно прогресса разметки]]&lt;br /&gt;
=== Фильтрация маркеров по режиму разметки ===&lt;br /&gt;
По умолчанию в [[Help:UI manual#Таблица маркеров|таблице маркеров]] отображаются все маркеры: как размеченные вручную, так и размеченные с помощью ИИ-ассистента.&lt;br /&gt;
Чтобы отобразить маркеры только с одним режимом разметки, воспользуйтесь [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательскими фильтрами]]:&lt;br /&gt;
* для отображения только маркеров, размеченных вручную, выберите фильтр '''Режим разметки''' – '''Вручную''';&lt;br /&gt;
* для отображения только маркеров, размеченных с помощью ИИ-ассистента, выберите фильтр '''Режим разметки''' – '''С помощью ИИ'''.&lt;br /&gt;
[[File:230 Пользовательские фильтры. Режимы разметки.png|thumb|none|x400px|Пользовательские фильтры. Режимы разметки]]&lt;br /&gt;
&lt;br /&gt;
== Описание модели xgb.joblib ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Модель обучена на базе 50000+ размеченных предупреждений.&lt;br /&gt;
&lt;br /&gt;
Для предсказания статуса разметки нами используются:&lt;br /&gt;
# языковая модель codebert-base для получения эмбеддингов кода;&lt;br /&gt;
# метод градиентного бустинга (xgboost) для решения задачи классификации.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3042</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3042"/>
		<updated>2025-07-09T04:31:29Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Поддержка ИИ-ассистента для разметки предупреждений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
'''Внимание''': данная функциональность не связана с функцией AI-ассистент из анализатора Svace https://svace.pages.ispras.ru/svace-website/2025/02/21/ai-assistant.html  . Функционал AI-ассистента из анализатора Svace будет интегрирован в Svacer в будущих версиях сервера. &lt;br /&gt;
&lt;br /&gt;
{{Note|text=[[Help:XSvacer:AIAssistant:Deploy|Инструкция по активации и запуску функциональности]] ИИ-ассистента}}&lt;br /&gt;
&lt;br /&gt;
Посмотреть, не разворачивая у себя, можно на нашем демо-стенде: https://svacer-ai-demo.ispras.ru (admin / admin).&lt;br /&gt;
&lt;br /&gt;
== Описание интерфейса ИИ-ассистента==&lt;br /&gt;
=== Разметка одного маркера ===&lt;br /&gt;
Чтобы разметить один маркер с помощью ИИ-ассистента:&lt;br /&gt;
:1. Нажмите кнопку [[File:Icon AI.png|25px]] [[Help:UI manual#Функции правой панели|на правой панели]] или в виджете маркера на [[Help:UI manual#Вкладка с исходным кодом|вкладке с исходным кодом]].&lt;br /&gt;
:[[File:221 Правая панель. Переход к ИИ-разметке.png|thumb|none|x200px|Правая панель. Переход к ИИ-разметке]]&lt;br /&gt;
:[[File:222 Виджет элемента трассы. Переход к ИИ-разметке.png|thumb|none|x150px|Виджет маркера на вкладке с исходным кодом. Переход к ИИ-разметке]]&lt;br /&gt;
:2. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированный статус и уровень доверия прогнозу отобразятся в этом же окне. &lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то в окне отобразится сообщение об этом и дальнейшая разметка станет недоступна.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Нажмите кнопку '''Применить'''.&lt;br /&gt;
:&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  223 Окно ИИ-разметки.png|Окно ИИ-разметки&lt;br /&gt;
  224 Окно ИИ-разметки. Статус совпадает.png|Окно ИИ-разметки. Прогнозный статус совпадает с существующим&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:Статус, установленный с помощью ИИ-ассистента, отобразится в верхней части правой панели и в виджете маркера на вкладке с исходным кодом с отметкой [[File:Icon AI 2.png|15px]]. Также этой иконкой будет отмечен статус в комментарии, добавленном при разметке, который дополнительно содержит информацию о проведенной разметке: время, имя модели машинного обучения, уровень доверия прогнозу.&lt;br /&gt;
:Дополнительная информация также отображается при наведении курсора на иконку [[File:Icon AI 2.png|15px]].&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  225 Правая панель. Результат ИИ-разметки.png|Правая панель. Результат ИИ-разметки&lt;br /&gt;
  227 Правая панель. Комментарий об ИИ-разметке.png|Правая панель. Комментарий об ИИ-разметке&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
[[File:226 Виджет элемента трассы. Результат ИИ-разметки.png|thumb|none|x150px|Виджет элемента трассы. Результат ИИ-разметки]]&lt;br /&gt;
&lt;br /&gt;
=== Групповая разметка маркеров ===&lt;br /&gt;
Чтобы разметить несколько маркеров с помощью ИИ-ассистента одновременно:&lt;br /&gt;
:1. Если планируется разметить большое количество маркеров, то для ускорения составления прогноза запустите предварительный рассчет (опционально) – на вкладке [[Help:UI manual#Вкладка «Информация о снимке»|'''Информация о снимке''']] [[Help:UI manual#Функции центральной панели|центральной панели]] нажмите кнопку '''Проанализировать с AI'''.&lt;br /&gt;
:Расчет прогнозируемого статуса для каждого маркера запустится в фоновом режиме. В это время на месте кнопки будет отображаться анимированная иконка ожидания.&lt;br /&gt;
:[[File:228 Информация о снимке. Предварительный расчет.png|thumb|none|x200px|Информация о снимке. Кнопка перехода к предварительному расчету статусов маркеров]]&lt;br /&gt;
:2. Выберите маркеры для разметки – установите флажки в строках [[Help:UI manual#Таблица маркеров|таблицы]].&lt;br /&gt;
:3. Нажмите кнопку [[File:Icon AI.png|25px]] (доступна, если выбраны маркеры в таблице).&lt;br /&gt;
:4. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированные статусы и уровни доверия прогнозу отобразятся в этом же окне в таблице маркеров. При этом размеченные ранее маркеры окрашены в цвет, соответствующий выставленному статусу. &lt;br /&gt;
::В таблице доступна сортировка значений в столбцах '''Детектор''', '''Файл''', '''Строка''' и '''Уровень доверия''', а в столбце '''Статус разметки''' доступна фильтрация по значению прогнозируемого статуса.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Выберите маркеры, которые требуется разметить, – установите флажки в столбце '''Статус разметки'''.&lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то он недоступен для установки флажка.&lt;br /&gt;
::г) Нажмите кнопку '''Применить'''.&lt;br /&gt;
:[[File:229 Окно групповой ИИ-разметки.png|thumb|none|x300px|Окно групповой ИИ-разметки]]&lt;br /&gt;
:Прогресс разметки отображается в соответствующем окне. Запущенный процесс можно полностью отменить нажатием кнопки '''Отмена'''.&lt;br /&gt;
:[[File:56 Окно прогресса разметки.png|thumb|none|x100px|Окно прогресса разметки]]&lt;br /&gt;
=== Фильтрация маркеров по режиму разметки ===&lt;br /&gt;
По умолчанию в [[Help:UI manual#Таблица маркеров|таблице маркеров]] отображаются все маркеры: как размеченные вручную, так и размеченные с помощью ИИ-ассистента.&lt;br /&gt;
Чтобы отобразить маркеры только с одним режимом разметки, воспользуйтесь [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательскими фильтрами]]:&lt;br /&gt;
* для отображения только маркеров, размеченных вручную, выберите фильтр '''Режим разметки''' – '''Вручную''';&lt;br /&gt;
* для отображения только маркеров, размеченных с помощью ИИ-ассистента, выберите фильтр '''Режим разметки''' – '''С помощью ИИ'''.&lt;br /&gt;
[[File:230 Пользовательские фильтры. Режимы разметки.png|thumb|none|x400px|Пользовательские фильтры. Режимы разметки]]&lt;br /&gt;
&lt;br /&gt;
== Описание модели xgb.joblib ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Модель обучена на базе 50000+ размеченных предупреждений.&lt;br /&gt;
&lt;br /&gt;
Для предсказания статуса разметки нами используются:&lt;br /&gt;
# языковая модель codebert-base для получения эмбеддингов кода;&lt;br /&gt;
# метод градиентного бустинга (xgboost) для решения задачи классификации.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3029</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3029"/>
		<updated>2025-07-07T10:52:37Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: 11-1-0 changelog&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 11-1-0 ===&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt;  можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir-ов сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность указания baseline для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к Postgres-у в SSL режиме https://gitlab.ispras.ru/svace/svace-support/-/issues/1217&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Sarif&amp;diff=3018</id>
		<title>Help:Sarif</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Sarif&amp;diff=3018"/>
		<updated>2025-06-17T05:41:07Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Использование quality gate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Работа с SARIF из CLI ==&lt;br /&gt;
Для импорта и экспорта результатов в формате SARIF Svacer предоставляет набор команд &amp;lt;code&amp;gt;svacer sarif2 import&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer sarif2 export&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основные возможности данных команд&lt;br /&gt;
&lt;br /&gt;
=== Импорт ===&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer sarif2 import - Import SARIF files to Svacer format&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer sarif2 import [command options] &amp;lt;path&amp;gt; &amp;lt;path&amp;gt; ... &amp;lt;path&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --ssl                                            Connect to the server using https protocol (default: false)&lt;br /&gt;
    --ssl-ca-certs value                             Trusted CA cert path. Example: /usr/local/certs/* , /usr/local/certs/ca.crt, /usr/local/certs/ca*.crt&lt;br /&gt;
    --user value                                     Valid user name&lt;br /&gt;
    --password value                                 Valid user password&lt;br /&gt;
    --host value                                     Valid host name with running svace history server (default: localhost) [$SVACER_HOST_NAME]&lt;br /&gt;
    --port value                                     Defines port for REST API (default: 8080) [$SVACER_API_PORT]&lt;br /&gt;
    --grpc value                                     Defines port for gRPC API (default: 3002) [$SVACER_GRPC_PORT]&lt;br /&gt;
    --ldap_server value                              Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --quick-stats                                    Report quick stats about uploaded snapshots (default: false)&lt;br /&gt;
    --out-format value                               Define format of reported information. Values: text|json. Default: text.&lt;br /&gt;
    --quality-gate value                             Specify a quality gate. Format: stat_1:severity_1:N_1,...,stat_k:severity_k:N_k, stat takes values: new, missing, matched, same, total; severity takes the following values: all, critical, major, normal, minor, undefined, &amp;lt;detector name part&amp;gt;; N is a natural number. If the severity of the number N is exceeded, it will out a warning. Also, as a value, you can specify a json or yaml file in which the quality gate is specified.&lt;br /&gt;
    --quality-gate-exit-code value                   Specify the exit code of the application in the range from 0 to 125, which will be issued when the quality-gate is exceeded. The default is 0.&lt;br /&gt;
    --out-file value                                 Target to print report information (by default stdout)&lt;br /&gt;
    --project-group value [ --project-group value ]  Project group where put new project. To set multiple project groups, use this flag multiple times&lt;br /&gt;
    --if-no-group value                              Defines if there is no project group with specified name: no-action (ignore project group with warning), add (add new project group), error (throw an error). The default is no-action&lt;br /&gt;
    --if-no-branch name                              Defines if there is no branch: clone-{name|id} (clone the branch with given name|id), create-empty (create a new empty branch), return-error (throw an error), name or `ID` of the branch to be cloned. The default is clone-master&lt;br /&gt;
    --attach value [ --attach value ]                Attach file(s) to the snapshot. To add multiple files, use this flag multiple times&lt;br /&gt;
    --field value [ --field value ]                  Adds custom field to the snapshot information. Format &amp;lt;field name&amp;gt;:&amp;lt;value&amp;gt;. &amp;lt;value&amp;gt; is treated as JSON string. Multiple occurrences of the same field are processed as array.&lt;br /&gt;
    --no-clean                                       Do not clean intermediate directory with pre-processed data before import (default: false)&lt;br /&gt;
    --upload                                         Upload data to the server (default: false)&lt;br /&gt;
    --project value                                  Set explicit project name. Default value is a name of the directory containing .svace-dir&lt;br /&gt;
    --branch value                                   Set branch name (default: master)&lt;br /&gt;
    --snapshot value                                 Set explicit snapshot name (default: &amp;lt;import time&amp;gt;)&lt;br /&gt;
    --path-prefix value                              Defines mapping rule for path prefixes in format &amp;lt;file&amp;gt; or line prefix:replacement;prefix:replacement&lt;br /&gt;
    --store value                                    Defines path to directory for pre-processed data. You may share the same directory for multiple projects. You can define remote store here to upload data to another server in a format remote:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt; (default: &amp;lt;current working dir&amp;gt;/.svacer-dir)&lt;br /&gt;
    --pattern value [ --pattern value ]              List of patterns to match files. Pattern is matched against full path&lt;br /&gt;
    --uriBaseId value                                Specifies the absolute URI with respect to which that relative reference is interpreted (see 3.4.4 in SARIF spec). Format '&amp;lt;name&amp;gt;=&amp;lt;path&amp;gt;,&amp;lt;name&amp;gt;=&amp;lt;path&amp;gt;,...&lt;br /&gt;
    --base-dir value                                 Base dir to resolve relative path in artifacts&lt;br /&gt;
    --include-contents                               Import/export artifact contents (source code) when it is available (default: false)&lt;br /&gt;
    --resolver value                                 Defines path to file with custom path resolver.&lt;br /&gt;
       User should provide file containing function with signature:&lt;br /&gt;
 &lt;br /&gt;
       // Return (&amp;lt;resolved path&amp;gt;, true) if path is resolved. Return (&amp;quot;&amp;quot;, false) if default (built-in) path resolver should be used&lt;br /&gt;
       // Function can use Go packages regexp, filepath, strings, fmt&lt;br /&gt;
       func ResolvePath (s string) (string, bool)&lt;br /&gt;
    --map-severity value  Defines relation between SARIF and Svacer checker severity.&lt;br /&gt;
       Expected format &amp;lt;sarif level|*&amp;gt;:&amp;lt;svacer level&amp;gt;,&amp;lt;sarif level&amp;gt;:&amp;lt;svacer level&amp;gt;,...&lt;br /&gt;
       All values are case-insensitive. Asterisk matches any severity. All rules are applied from left to right&lt;br /&gt;
       Example: note:minor,error:critical,*:major&lt;br /&gt;
    --autoclean  Remove .svacer-dir after successfull upload (default: false)&lt;br /&gt;
    --help       Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Пример импорта c включением содержимого файлов (при наличии его в самом sarif-файле или возможности найти файл в процессе импорта):&lt;br /&gt;
&lt;br /&gt;
  svacer sarif2 import --store /tmp/sarif --include-contents /path/to/sarif/file.sarif&lt;br /&gt;
&lt;br /&gt;
Если sarif-файл содержит относительные пути, то можно указать опцию &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt; для поиска файлов относительно указанной директории.&lt;br /&gt;
&lt;br /&gt;
Далее полученный intermediate store можно загрузить командой upload как и для импорта svres. Также можно скомбинировать import с upload:&lt;br /&gt;
&lt;br /&gt;
  svacer sarif2 import --upload --store /tmp/sarif --include-contents /path/to/sarif/file.sarif&lt;br /&gt;
&lt;br /&gt;
==== Использования флага &amp;lt;code&amp;gt;--resolver&amp;lt;/code&amp;gt; ====&lt;br /&gt;
В случае, если исходные файлы лежат в иных локациях и простым образом указать &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;--uriBaseId&amp;lt;/code&amp;gt; нельзя (допустим, пути Windows-specific а импорт идет на Linux), то пользователь может указать параметр &amp;lt;code&amp;gt;--resolver&amp;lt;/code&amp;gt; с путем к файлу, где написана функция конверсии путей. Файл должен содержать Go функцию&lt;br /&gt;
&lt;br /&gt;
 func ResolvePath (s string) (string, bool) {&lt;br /&gt;
     // пользовательская логика преобразования пути. Возвращать &amp;quot;&amp;quot;, false, если надо применить обычные правила&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Функция обрабатывается в ходе импорта Sarif, для выполнения используется функционал https://github.com/traefik/yaegi Пользователь может использовать пакеты &amp;lt;code&amp;gt;fmt, regexp, strings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Мэппинг severity ====&lt;br /&gt;
Для задания правил отображения checker severity при импорте Sarif, пользователь может использовать флаг &amp;lt;code&amp;gt;--map-severity&amp;lt;/code&amp;gt;. Флаг ожидает значение в виде строки в формате &amp;lt;code&amp;gt;&amp;lt;sarif level|*&amp;gt;:&amp;lt;svacer level&amp;gt;,&amp;lt;sarif level&amp;gt;:&amp;lt;svacer level&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 --map-severity note:minor,error:critical,*:major&lt;br /&gt;
&lt;br /&gt;
==== Импорт трасс ====&lt;br /&gt;
Конструкции SARIF &amp;lt;code&amp;gt;сodeFlow&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;relatedLocations&amp;lt;/code&amp;gt; импортируются в трассы в концепции Svacer. &lt;br /&gt;
&lt;br /&gt;
Location в исходных конструкциях SARIF должен содержать номер строки. Если location задан через offset, то при импорте может получится некорректная строка.  &lt;br /&gt;
&lt;br /&gt;
=== Использование quality gate ===&lt;br /&gt;
Смотрите секцию про &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; в  [https://svacer.ispras.ru/mediawiki/index.php?title=Help:Import_from_Svace#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_--full-paths Help:Import from Svace]&lt;br /&gt;
=== Экспорт ===&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer sarif2 export - Export snapshot(s) to SARIF format&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer sarif2 export [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --ssl                     Connect to the server using https protocol (default: false)&lt;br /&gt;
    --ssl-ca-certs value      Trusted CA cert path. Example: /usr/local/certs/* , /usr/local/certs/ca.crt, /usr/local/certs/ca*.crt&lt;br /&gt;
    --user value              Valid user name&lt;br /&gt;
    --password value          Valid user password&lt;br /&gt;
    --host value              Valid host name with running svace history server (default: localhost) [$SVACER_HOST_NAME]&lt;br /&gt;
    --port value              Defines port for REST API (default: 8080) [$SVACER_API_PORT]&lt;br /&gt;
    --grpc value              Defines port for gRPC API (default: 3002) [$SVACER_GRPC_PORT]&lt;br /&gt;
    --ldap_server value       Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --with-viewer-uri         Add hostedViewerUri property to results. Works only if server is running with --public-url option (default: false)&lt;br /&gt;
    --project value           Project name or ID. Default value is master&lt;br /&gt;
    --branch value            Branch name or ID (default: master)&lt;br /&gt;
    --snapshot value          Snapshot name or ID. Default value is latest snapshot (default: &amp;lt;latest&amp;gt;)&lt;br /&gt;
    --include-contents        Import/export artifact contents (source code) when it is available (default: false)&lt;br /&gt;
    --out value, -o value     Set explicit output filename (or &amp;quot;-&amp;quot; for stdout)&lt;br /&gt;
    --comment-template value  [DEPRECATED]Set sarif result comments template&lt;br /&gt;
    --single-code-flow        Generate SARIF report with single code flow (default: false)&lt;br /&gt;
    --with-taxonomies         Generate SARIF report with taxonomies (default: false)&lt;br /&gt;
    --help                    Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Полный список опций может быть получен при выполнении команд:&lt;br /&gt;
  svacer sarif2 import --help&lt;br /&gt;
  svacer sarif2 export --help&lt;br /&gt;
&lt;br /&gt;
Пример экспорта с включением содержимого файлов в артефакты:&lt;br /&gt;
  svacer sarif2 export --host localhost --user admin --password admin --include-contents --project bash --out /tmp/out.sarif&lt;br /&gt;
&lt;br /&gt;
Экспорт в SARIF включает дополнительные данные в &amp;lt;code&amp;gt;properties&amp;lt;/code&amp;gt; объект у соответствующего SARIF объекта. Дополнительные данные состоят из:&lt;br /&gt;
&lt;br /&gt;
* информация о проекте, ветке и снимке&lt;br /&gt;
* информация о разметке (статус, severity, action, кем была выполнена и дата)&lt;br /&gt;
* информация о детекторе (severity, reliability, warnClass и прочая информация)&lt;br /&gt;
* дополнительные поля от маркера (mtid, invariant, function и т. д.)&lt;br /&gt;
* тэги (метки)&lt;br /&gt;
* комментарии&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;code&amp;gt;fingerprints&amp;lt;/code&amp;gt; используется &amp;lt;code&amp;gt;invariant&amp;lt;/code&amp;gt; маркера. Для генерации &amp;lt;code&amp;gt;partialFingerprints&amp;lt;/code&amp;gt; используется поле &amp;lt;code&amp;gt;details&amp;lt;/code&amp;gt; у маркера.&lt;br /&gt;
&lt;br /&gt;
Трасса отображается в &amp;lt;code&amp;gt;codeFlows&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве &amp;lt;code&amp;gt;logicalLocations&amp;lt;/code&amp;gt; используется поле &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Оценка размера экспортированного файла ====&lt;br /&gt;
Снимок с примерно 34 тысячами предупреждений, содержащий разметку и комментарии для ядра Linux при экспорте с включением исходного кода производит SARIF файл размером 450Мб (в сжатом виде получается порядка 70Мб).&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Import_from_Svace&amp;diff=3017</id>
		<title>Help:Import from Svace</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Import_from_Svace&amp;diff=3017"/>
		<updated>2025-06-17T05:34:07Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Использование quality gate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI команды ==&lt;br /&gt;
  svacer import --svace &amp;lt;path-to-svace&amp;gt;&lt;br /&gt;
  svacer upload&lt;br /&gt;
&lt;br /&gt;
Эти две команды импортируют результаты анализа из '''.svace-dir''' в текущей директории и загрузят их на сервер Svacer по адресу '''localhost:8080'''.&lt;br /&gt;
&lt;br /&gt;
== Процесс импорта ==&lt;br /&gt;
Процесс импорта результатов работы статического анализатора Svace состоит из двух шагов:&lt;br /&gt;
# Дедупликация данных, предобработка, конвертирование во внутренний формат и сохранение результатов в промежуточном хранилище (svacer import).&lt;br /&gt;
# Загрузка данных из промежуточного хранилища на сервер (svacer upload).&lt;br /&gt;
&lt;br /&gt;
Можно импортировать результаты и из других статических анализаторов, поддерживающих [[Help:Sarif#Загрузка на сервер из SARIF|формат SARIF]].&lt;br /&gt;
&lt;br /&gt;
=== Промежуточное хранилище ===&lt;br /&gt;
Промежуточное хранилище используется для хранения результатов, подготовленных для загрузки на сервер. При импорте данных в промежуточное хранилище снимкам назначается уникальный ID, задается имя проекта и ветки. &lt;br /&gt;
Промежуточное хранилище можно использовать для аккумулирования результатов нескольких запусков анализатора, в том числе для различных проектов. &lt;br /&gt;
По умолчанию, промежуточное хранилище создается в директории '''.svacer-dir''' рядом с директорией '''.svace-dir.'''&lt;br /&gt;
Параллельный доступ к хранилищу из разных экземпляров Svacer '''не допускается'''. Если необходимо использовать разделяемое хранилище и конкурентный доступ, Svacer следует запускать в режиме удаленного промежуточного хранилища.&lt;br /&gt;
Процедура импорта c промежуточным хранилищем по умолчанию (размещается в '''&amp;lt;path to project&amp;gt;/.svacer-dir'''):&lt;br /&gt;
&lt;br /&gt;
    svacer import --svace &amp;lt;path to svace&amp;gt; [path to project]&lt;br /&gt;
&lt;br /&gt;
где '''&amp;lt;path to svace&amp;gt;''' — путь к исполняемому файлу svace из дистрибутива svace, '''[path to project]''' — путь к проекту (директории, содержащей .svace-dir). Его можно не указывать, тогда в качестве пути к проекту будет использована текущая директория.&lt;br /&gt;
&lt;br /&gt;
Процедура импорта с явным указанием размещения промежуточного хранилища:&lt;br /&gt;
&lt;br /&gt;
    svacer import --store &amp;lt;path to store&amp;gt; --svace &amp;lt;path to svace&amp;gt; &amp;lt;path to project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пользовательские атрибуты ===&lt;br /&gt;
При импорте данных можно ассоциировать пользовательские строковые атрибуты со снимком. Значения атрибутов доступно посредством публичного REST API и интерфейса командной строки. Это позволяет связать дополнительные данные с результатами (например commit ID). Пользовательские атрибуты нельзя модифицировать после импорта данных на сервер.&lt;br /&gt;
Пользовательские атрибуты экспортируются и импортируются как часть информации при использовании функциональности по экспорту и импорту снимков.&lt;br /&gt;
&lt;br /&gt;
Пользовательский атрибут может быть передан при использовании команды import посредством опции '''--field &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt;'''. Опция может быть указана несколько раз в командной строке.&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --field f1:val1 --field f2:val2 ...&lt;br /&gt;
&lt;br /&gt;
Если одно и тоже поле указано несколько раз, то значения поля сохраняются как JSON массив строк. &lt;br /&gt;
'''Допустимое имя''' пользовательского атрибута состоит из латинских букв, цифр, знаков подчеркивание или минуса.&lt;br /&gt;
&lt;br /&gt;
Для получения списка всех пользовательских атрибутов в JSON виде используется следующая команда в командной строке&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt;  --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''custom_fields'''&lt;br /&gt;
&lt;br /&gt;
Результат операции выдается как JSON объект в stdout. Объект имеет следующую структуру&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;field name1&amp;quot;:&amp;quot;value&amp;quot;,&lt;br /&gt;
    &amp;quot;field name2&amp;quot;: [&amp;quot;value&amp;quot;, &amp;quot;value&amp;quot;..]&lt;br /&gt;
    } &lt;br /&gt;
Для получения значения конкретного пользовательского атрибута используется следующая команда&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt;  --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''custom_fields --get &amp;lt;field name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Значение атрибута выводится в stdout как JSON строка или массив.&lt;br /&gt;
=== Клонирование ветки ===&lt;br /&gt;
При импорте данных возможно клонирование ветки (вместе со снимками, разметкой и комментариями) из того же проекта, куда происходит импорт данных.&lt;br /&gt;
&lt;br /&gt;
Для клонирования ветки следует использовать опцию '''--if-no-branch &amp;lt;value&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --if-no-branch &amp;lt;value&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Значения, которые может принимать опция '''--if-no-branch''':&lt;br /&gt;
&lt;br /&gt;
* '''clone-{name|id}''' — клонировать ветку с заданным именем|id (по умолчанию clone-master)&lt;br /&gt;
* '''create-empty''' — создает пустую ветку&lt;br /&gt;
* '''return-error''' — возвращает ошибку, если для опции '''--branch &amp;lt;branch_name&amp;gt;''' не существует ветки с именем branch_name&lt;br /&gt;
&lt;br /&gt;
{{Note}} Если не указать данную опцию, то будет автоматически клонироваться ветка master, поэтому для избежания ошибок следует убедиться, что ветка master существует, если данная опция не указана, иначе будет выведена ошибка.&lt;br /&gt;
&lt;br /&gt;
==== Клонирование разметки и комментариев ====&lt;br /&gt;
При импорте данных возможно клонирование разметки и комментариев ветки из того же проекта, куда происходит импорт данных.&lt;br /&gt;
&lt;br /&gt;
Для клонирования разметки и комментариев следует использовать опцию '''--clone-review {name|id}'''&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --clone-review {name|id} ...&lt;br /&gt;
&lt;br /&gt;
Данная опция принимает имя или id ветки, из которой необходимо склонировать разметку и комментарии.&lt;br /&gt;
&lt;br /&gt;
Приоритет опции '''--clone-review''' выше, чем у опции '''--if-no-branch''', поэтому возможно клонировать снимки из одной ветки, а разметку и комментарии из другой.&lt;br /&gt;
&lt;br /&gt;
Если ветка с таким именем или id не будет найдена, то при загрузке данных ('''svacer upload ...''', либо '''svacer import --upload ...''') загрузка произойдет, но без склонированной разметки.&lt;br /&gt;
&lt;br /&gt;
=== Прикрепление файлов ===&lt;br /&gt;
При импорте данных возможно прикрепление файлов размером до 300Мб к снимку. Файлы будут доступны пользователю в веб-интерфейсе и посредством интерфейса командной строки. Прикрепленные файлы фиксируются в момент операции импорта и не могут быть модифицированы после загрузки на сервер. Удалить файлы может администратор посредством веб интерфейса. Основное назначение данной функциональности прикрепление некоторой иммутабельной информации к результатам анализа для использования в интеграциях со сторонними системами.&lt;br /&gt;
Прикрепленные файлы являются частью данных, которые экспортируются и импортируются посредством функциональности экспорта и импорта снимков.&lt;br /&gt;
&lt;br /&gt;
Для прикрепления файлов следует использовать опцию '''--attach &amp;lt;file name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --attach file1.txt --attach file2.txt ...&lt;br /&gt;
&lt;br /&gt;
Опция может быть указана несколько раз. После загрузки данных на сервер файлы будут видимы в панели информации о снимке&lt;br /&gt;
&lt;br /&gt;
[[File:SnapshotInfo.png|none|alt=Snapshot Info Window]]&lt;br /&gt;
&lt;br /&gt;
Для получения списка файлов из командной строки  следует использовать команду&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt; --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''attachments''' --list&lt;br /&gt;
&lt;br /&gt;
Результат работы команды представляет собой JSON массив объектов вида&lt;br /&gt;
    &lt;br /&gt;
    [{&lt;br /&gt;
        &amp;quot;id&amp;quot;: 11,&lt;br /&gt;
        &amp;quot;snapshot_id&amp;quot;: &amp;quot;d99c23f7-9fb9-4f4e-85ac-2539328947e0&amp;quot;,&lt;br /&gt;
        &amp;quot;lid&amp;quot;: 122885,&lt;br /&gt;
        &amp;quot;short_name&amp;quot;: &amp;quot;Makefile&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;/home/ruseer/static-analysis/svacer/Makefile&amp;quot;,&lt;br /&gt;
        &amp;quot;created_by&amp;quot;: &amp;quot;importer&amp;quot;,&lt;br /&gt;
        &amp;quot;updated_by&amp;quot;: null,&lt;br /&gt;
        &amp;quot;create_ts&amp;quot;: &amp;quot;2022-10-18T06:41:54.532925Z&amp;quot;,&lt;br /&gt;
        &amp;quot;update_ts&amp;quot;: null,&lt;br /&gt;
        &amp;quot;checksum&amp;quot;: &amp;quot;9b1e02a276e810829ac2e38fb775c4ff8d269d0f44fd0fbae40f79a0320389ad&amp;quot;&lt;br /&gt;
    }]&lt;br /&gt;
    &lt;br /&gt;
Для получения содержимого файла из командной строки следует использовать команду&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt;  --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''attachments''' --get &amp;lt;id&amp;gt; &amp;lt;output file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Если '''&amp;lt;output file&amp;gt;''' не указан, то результат будет напечатан  в stdout;&lt;br /&gt;
* Если '''&amp;lt;branch&amp;gt;''' не указан, то будет использован ветка master;&lt;br /&gt;
* Если '''&amp;lt;snapshot&amp;gt;''' не указан, то будет использован последний снимок на указанной ветке.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка данных на сервер ===&lt;br /&gt;
{{Note|type=warn|text=При загрузке данных на сервер, а также при прочих взаимодействиях клиента Svacer с сервером Svacer, крайне рекомендуется, чтобы версия клиента совпадала с версией сервера. В случае несовпадения версий возможны непредсказуемые ошибки.}}&lt;br /&gt;
&lt;br /&gt;
Для загрузки данных из промежуточного хранилища на сервер используется команда '''upload''':&lt;br /&gt;
&lt;br /&gt;
    svacer upload --user &amp;lt;user&amp;gt; --password &amp;lt;pwd&amp;gt; --host &amp;lt;host&amp;gt; --port &amp;lt;rest_port&amp;gt; --grpc &amp;lt;grpc_port&amp;gt; &amp;lt;path_to_store&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если отсутствуют параметры:&lt;br /&gt;
* '''--user''' и '''--password''', то используется специальный системный пользователь '''importer''' — он предназначен для импорта данных на сервер;&lt;br /&gt;
* '''--host''', то используется '''locahost''';&lt;br /&gt;
* '''--port''' и '''--grpc''', то используются их значения по умолчанию;&lt;br /&gt;
При загрузке данных на сервер уже загруженные снимки повторно не загружаются. Разделяемая информация (такая как исходные файлы, где один и тот же файл может использоваться в различных анализах и т.п.) также повторно не загружается. &lt;br /&gt;
При сбоях в ходе загрузки проводится повторная загрузка, но при этом загружаются только недостающие данные.&lt;br /&gt;
&lt;br /&gt;
В случае если Svacer запущен с поддержкой SSL/TLS или работает за reverse proxy и доступен по протоколу HTTPS, то для загрузки требуется явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&lt;br /&gt;
    svacer upload --host https://&amp;lt;url_without_port&amp;gt; &amp;lt;path_to_store&amp;gt;&lt;br /&gt;
    svacer upload --ssl --host &amp;lt;url_without_port&amp;gt; &amp;lt;path_to_store&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом grpc порт (по умолчанию — 3002), по которому идет загрузка данных, на сервере должен быть доступен.&lt;br /&gt;
&lt;br /&gt;
Для информации о загрузке данных на сервер с авторизацией в LDAP см. [[LDAP configuration#Использование CLI сервера Svacer с поддержкой LDAP|Использование CLI Svacer с поддержкой LDAP]].&lt;br /&gt;
&lt;br /&gt;
При загрузке данных на сервер можно включить печать краткой статистики по загруженным результатам. Данная статистика включает информацию о новых и пропущенных предупреждениях, по сравнению с последним ранее загруженным снимком. Выдача краткой статистики возможно в текстовом или JSON виде. Результаты печатаются в stdout.&lt;br /&gt;
&lt;br /&gt;
    svacer upload ... --quick-stats --out-format text ...&lt;br /&gt;
&lt;br /&gt;
Пример вывода&lt;br /&gt;
    Quick Stats:&lt;br /&gt;
    Previous snapshot   : Snapshot 2022-11-16 10:11:37 +0300&lt;br /&gt;
    Current snapshot    : Snapshot 2022-11-16 10:23:08 +0300&lt;br /&gt;
    New                 : 1&lt;br /&gt;
    Missing             : 0&lt;br /&gt;
    Matched             : 1&lt;br /&gt;
    Same                : 0&lt;br /&gt;
&lt;br /&gt;
    svacer upload ... --quick-stats --out-format json ...&lt;br /&gt;
&lt;br /&gt;
Пример вывода&lt;br /&gt;
    {&amp;quot;branch&amp;quot;:&amp;quot;391f21d1-2173-449c-9d1a-dd846d2a6471&amp;quot;,&amp;quot;snapshot&amp;quot;:&amp;quot;34a1125d-86a3-45d3-9b41-cb5da24ab96e&amp;quot;,&amp;quot;snapshotName&amp;quot;:&amp;quot;Snapshot 2022-11-21 10:19:06 +0300&amp;quot;,&amp;quot;lastSnapshot&amp;quot;:&amp;quot;59657ae8-c3b6-48bc-b586-a6c0580cdb50&amp;quot;,&amp;quot;lastSnapshotName&amp;quot;:&amp;quot;Snapshot 2022-11-21 10:18:09 +0300&amp;quot;,&amp;quot;same&amp;quot;:2}&lt;br /&gt;
&lt;br /&gt;
Формат JSON определяется protobuf3 схемой (ряд полей носит внутренний характер):&lt;br /&gt;
 message ImportSummaryContext {&lt;br /&gt;
   string branch = 1;&lt;br /&gt;
   string snapshot = 2;&lt;br /&gt;
   string snapshotName = 9;&lt;br /&gt;
   string lastSnapshot = 3;  &lt;br /&gt;
   string lastSnapshotName = 4;  &lt;br /&gt;
   int64 new = 5;&lt;br /&gt;
   int64 missing = 6;&lt;br /&gt;
   int64 matched = 7;&lt;br /&gt;
   int64 same = 8;&lt;br /&gt;
   string qualityGate = 10;&lt;br /&gt;
   string baseline_branch_name = 11;&lt;br /&gt;
   string baseline_project_name = 12;&lt;br /&gt;
   string branch_name = 13;&lt;br /&gt;
   string project_name = 14;&lt;br /&gt;
   string project_id = 15;  &lt;br /&gt;
   string baseline_snapshot_id = 16;&lt;br /&gt;
   string baseline_branch_id = 19;&lt;br /&gt;
   string baseline_project_id = 20;&lt;br /&gt;
   string baseline_snapshot_name = 21;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
По умолчанию, если опция по указанию формата выдачи отсутствует, выдача идет в текстовом режиме.&lt;br /&gt;
&lt;br /&gt;
=== Переименование снимка после импорта ===&lt;br /&gt;
&lt;br /&gt;
При необходимости, имя загруженного снимка можно изменить. Данная опция поддерживается только для пользователей с правами администратора сервера.&lt;br /&gt;
&lt;br /&gt;
   svacer container snapshot rename --host &amp;lt;host&amp;gt; --port &amp;lt;port&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;pwd&amp;gt; --id &amp;lt;snapshot id&amp;gt; --name &amp;lt;snapshot name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Идентификатор снимка можно посмотреть в веб-интерфейсе или получить посредством public API.&lt;br /&gt;
&lt;br /&gt;
=== Модификация путей в разметке при импорте ===&lt;br /&gt;
&lt;br /&gt;
==== Обычное поведение ====&lt;br /&gt;
По умолчанию пути к файлам не меняются, за исключением пути к папки '''.svace-dir''', он будет заменён на '''.build'''. Эту информацию можно увидеть при импорте проекта:&lt;br /&gt;
&lt;br /&gt;
    svacer import --clean .svacer-dir&lt;br /&gt;
    ...&lt;br /&gt;
    info    The path prefix of .svace-dir 'C:\work\generate_files\gen_exp' will be trimmed when converting file paths&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
После этого все маркеры из этой папки и дочерних будут в '''Review''' показывать путь вида '''/.build/test500_1.c''' вместо полного пути для файла '''C:\work\generate_files\gen_exp\test500_1.c'''.&lt;br /&gt;
&lt;br /&gt;
[[File:SimpleSourceCode.png|none|alt=Simple Source Code Window]]&lt;br /&gt;
&lt;br /&gt;
==== Использование --path-prefix ====&lt;br /&gt;
При необходимости модификацию по умолчанию можно заменить через '''--path-prefix'''.&lt;br /&gt;
Значения опции передаются в виде:&lt;br /&gt;
&lt;br /&gt;
    --path-prefix &amp;quot;prefix_for_replace1:value1;prefix_for_replace2:value2; ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Поддерживается как передача данных сразу в опцию, так и через указание файла содержащего значения. Разумно делать замены для унификации вида проекта, собранного на разных машинах (или из разных папок). При использовании файла допустимо размещать каждую замену на отдельную строчку.&lt;br /&gt;
&lt;br /&gt;
Префиксы путей заменяются только при полном совпадении (включая регистр, даже на Windows).&lt;br /&gt;
Для указания двоеточия в префиксе пути используется удвоенное двоеточие, к примеру (для показа преобразований добавлено  '''--debug'''):&lt;br /&gt;
&lt;br /&gt;
    svacer --debug import --clean --upload --path-prefix &amp;quot;C::\work:work&amp;quot; .svacer-dir&lt;br /&gt;
    ...&lt;br /&gt;
    INFO    Creating regular object store&lt;br /&gt;
    DEBUG   Creating path mapping rule 'C:\work' =&amp;gt; 'work'&lt;br /&gt;
    DEBUG   Creating path mapping rule 'C:/work' =&amp;gt; 'work'&lt;br /&gt;
    DEBUG   Creating path mapping rule '/C_/work' =&amp;gt; 'work'&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
После импорта на сервере можно увидеть файл: '''/work/generate_files/gen_exp/test500_1.c'''&lt;br /&gt;
&lt;br /&gt;
[[File:PathPrefixSourceCode.png|none|alt=PathPrefixSourceCode]]&lt;br /&gt;
&lt;br /&gt;
==== Использование --build-object @auto ====&lt;br /&gt;
При импорте конкретного файла *.svres исходный код может быть загружен, при указании опции '''--build-object @auto'''. В случае, если этот файл лежит в папке .svace-dir, исходный код будет взят из нее. При отсутствии папки .svace-dir файлы будут браться по абсолютным путям из файла *.svres.&lt;br /&gt;
Для указания конкретных директорий поиска подходящих файлов из *.svres следует использовать опцию '''--source-tree''', которую можно указать несколько раз, чтобы задать несколько корневых директорий. Поиск в этих директориях будет происходить только в случае, когда по путям из файла *.svres были найдены не все файлы. В случае успешного сопоставления, на сервер будут загружены соответствующие файлы из директории source tree.&lt;br /&gt;
&lt;br /&gt;
==== Использование --full-paths ====&lt;br /&gt;
Допустимо также полное отключение модификаций путей, для этого импорт надо производить с опцией '''--full-paths'''. Опция блокирует как модификацию по умолчанию '''.build''', так и явные указания через '''--path-prefix'''.&lt;br /&gt;
&lt;br /&gt;
    svacer --debug import --clean --upload --full-paths .svacer-dir&lt;br /&gt;
&lt;br /&gt;
После загрузки на сервере будет виден только полный путь: '''/C_/work/generate_files/gen_exp/test500_1.c'''.&lt;br /&gt;
&lt;br /&gt;
[[File:FullPathsSourceCode.png|none|alt=FullPathsSourceCode window]]&lt;br /&gt;
&lt;br /&gt;
Пути из Windows преобразуются в стиль Linux с небольшим преобразованием символов.&lt;br /&gt;
&lt;br /&gt;
=== Использование quality gate ===&lt;br /&gt;
&lt;br /&gt;
Возможна проверка новых, пропущенных, одинаковых, измененных предупреждений, для этого надо производить импорт с опцией '''--quality-gate'''.&lt;br /&gt;
&lt;br /&gt;
   --quality-gate value            Specify a quality gate. Format: stat_1:severity_1:N_1:[statuses_1],...,stat_k:severity_k:N_k:[statuses_k], stat takes values: new, missing, matched, same, total; severity takes the following values: all, critical, major, normal, minor, undefined, &amp;lt;detector name part&amp;gt;; N is a natural number; statuses - an optional field, specified in square brackets with a separator &amp;quot;;&amp;quot; possible values - confirmed, false_positive, wont_fix, unclear, undecided, when specifying statuses, the quality gate will be searched only for markers that have exactly these statuses, for example [confirmed;wont_fix;undecided]. If the severity of the number N is exceeded, it will out a warning. Also, as a value, you can specify a json or yaml file in which the quality gate is specified.&lt;br /&gt;
&lt;br /&gt;
Флаг принимает на вход тип предупреждений (stat), severity, их количество (N) и их статусы (statuses).&lt;br /&gt;
&lt;br /&gt;
* stat задает тип предупреждений. Возможные значения:&lt;br /&gt;
** '''new''' (присутствует в новом снимке, но отсутствует в старом)&lt;br /&gt;
** '''missing''' (присутствует в старом снимке, но отсутствует в новом)&lt;br /&gt;
** '''matched''' (присутствуют изменения в файлах не повлиявшие на выданное предупреждение)&lt;br /&gt;
** '''same''' (одинаковые)&lt;br /&gt;
** '''total''' (сумма всех вышеперечисленных)&lt;br /&gt;
* severity задается либо непосредственным его указанием ('''critical''', '''major''', '''normal''', '''minor''', '''undefined'''), либо '''all''' (все severity), либо частью имени детектора в формате postgres ILIKE https://www.postgresql.org/docs/current/functions-matching.html&lt;br /&gt;
* N - порог, после которого вызывается срабатывание. Не включает данное число (т.е. если указать 5, то при нахождении 6 и более вызывается срабатывание quality-gate)&lt;br /&gt;
* statuses - '''опциональное''' поле, в котором можно указать какие статусы (разметку) учитывать при нахождении предупреждений. Возможные значения '''confirmed''', '''false_positive''', '''wont_fix''', '''unclear''', '''undecided'''. Задаются в квадратных скобках с разделителем &amp;quot;;&amp;quot;. Например, [confirmed;wont_fix]. Если не указать данное поле, то будут учитываться все статусы. При указании в command line рекомендуется значение опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt; экранировать в двойные кавычки. Принципы учета статусов:&lt;br /&gt;
** Если предупреждение размечено в новом снимке (значение не '''undecided'''), разметка берется из нового предупреждения&lt;br /&gt;
** Если в новом снимке нет разметки у данного предупреждения, а в старом есть, то берется разметка из старого предупреждения&lt;br /&gt;
** В остальных случаях у данного предупреждения разметка равна '''undecided'''.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 --quality-gate &amp;quot;total:critical:0:[confirmed;wont_fix],new:all:10&amp;quot;&lt;br /&gt;
Тогда опция сработает, если либо:&lt;br /&gt;
&lt;br /&gt;
1) статическим анализатором будут найдены общее количество предупреждений (новых, пропущенных, одинаковых, измененных) с '''severity:critical''' и статусами '''confirmed''' и '''won't fix'''&lt;br /&gt;
&lt;br /&gt;
2) статическим анализатором будут найдены новые предупреждения с любым статусом и severity&lt;br /&gt;
&lt;br /&gt;
Пример вывода:&lt;br /&gt;
 Quality gate exceed:&lt;br /&gt;
 Previous snapshot   : Snapshot 2025-06-16 15:37:09 +0300&lt;br /&gt;
 Current snapshot    : Snapshot 2025-06-16 15:37:39 +0300&lt;br /&gt;
 Stat                : total&lt;br /&gt;
 Severity            : Critical&lt;br /&gt;
 Severity Statuses   : confirmed wont_fix&lt;br /&gt;
 Severity Threshold  : 0&lt;br /&gt;
 Found Severity      : 3&lt;br /&gt;
Также quality-gate можно задать файлом в формате json или yaml (не yml).&lt;br /&gt;
&lt;br /&gt;
Пример json файла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;total:all:1&amp;quot;, &amp;quot;total:proc:1&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример yaml файла:&lt;br /&gt;
  - &amp;quot;total:all:1&amp;quot;&lt;br /&gt;
  - &amp;quot;total:proc:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Флаг --quality-gate-exit-code ====&lt;br /&gt;
В случае срабатывания quality gate можно указать какой exit code будет возвращен&lt;br /&gt;
 --quality-gate-exit-code value                                       Specify the exit code of the application in the range from 0 to 125, which will be issued when the quality-gate is exceeded. The default is 0.&lt;br /&gt;
Принимает значения от 0 до 125. '''Внимание''': значение по умолчанию 0, поэтому без явного задания exit code провал quality-gate-а не вернет не нулевой статус и при использовании в CI/CD pipline не будет помечен как failed. Так сделано для упрощения внедрения quality-gate опции в существующие pipeline-ы. Вначале можно проанализировать логи и если данные корректны, то добавить опцию &amp;lt;code&amp;gt;--quality-gate-exit-code&amp;lt;/code&amp;gt; с не нулевым значением.&lt;br /&gt;
&lt;br /&gt;
==== Флаг --quality-gate-verbose ====&lt;br /&gt;
Если необходимо выводить информацию и об успешно прошедших quality gate, то нужно добавить флаг --quality-gate-verbose, тогда в конце будет вывод успешно прошедших quality gate&lt;br /&gt;
&lt;br /&gt;
Пример вывода:&lt;br /&gt;
 Quality gate exceed:&lt;br /&gt;
 Previous snapshot   : Snapshot 2025-06-16 15:37:39 +0300&lt;br /&gt;
 Current snapshot    : Snapshot 2025-06-16 16:10:33 +0300&lt;br /&gt;
 Stat                : total&lt;br /&gt;
 Severity            : Critical&lt;br /&gt;
 Severity Statuses   : confirmed wont_fix&lt;br /&gt;
 Severity Threshold  : 0&lt;br /&gt;
 Found Severity      : 3&lt;br /&gt;
 The result of comparison of those who have completed quality gate:&lt;br /&gt;
 Previous snapshot   : Snapshot 2025-06-16 15:37:39 +0300&lt;br /&gt;
 Current snapshot    : Snapshot 2025-06-16 16:10:33 +0300&lt;br /&gt;
 Stat                : new&lt;br /&gt;
 Severity            : All&lt;br /&gt;
 Severity Threshold  : 10&lt;br /&gt;
 Found Severity      : 0&lt;br /&gt;
&lt;br /&gt;
==== Флаг --baseline ====&lt;br /&gt;
Если сравнение необходимо проводить не с предыдущим снимком в этой же ветке, то можно указать флаг '''--baseline''' (также работает для флага &amp;lt;code&amp;gt;--quick-stats&amp;lt;/code&amp;gt;)&lt;br /&gt;
  --baseline value                                                     A snapshot to compare (--quality-gate and/or --quick-stats). Format: {project}:::{branch}:::{snapshot} or {project}:::{branch} or {project} use UUID or name. By default, snapshot is the last added, branch is master. If the flag is not specified, then the comparison will be with the latest snapshot from the branch where the snapshot is loaded.&lt;br /&gt;
Указывается в формате &amp;lt;code&amp;gt;{project}:::{branch}:::{snapshot}&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;{project}:::{branch}&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;{project}&amp;lt;/code&amp;gt;, используя имена или UUID. По умолчанию используется ветка master (если указан только проект) и последний добавленный снимок (если снимок не указан).&lt;br /&gt;
&lt;br /&gt;
При указании данного флага меняется вывод:&lt;br /&gt;
&lt;br /&gt;
* В текстовом формате добавляются строки об имени проекта, ветки и снимка, с которым сравнивался загружаемый снимок.&lt;br /&gt;
* В json формате добавляются имена и id проекта,ветки и снимка, с которым сравнивался загружаемый снимок.&lt;br /&gt;
* '''Внимание''': если baseline не может быть точно определен (ошибка в имени проекта, ветки и т.п), то импорт не производится и выдается ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Флаг --out-file'''&lt;br /&gt;
&lt;br /&gt;
Для указания файла, в который необходимо загрузить результаты quality gate, используете опцию --out-file (по умолчанию вывод идет в stdout)&lt;br /&gt;
&lt;br /&gt;
'''Флаг --out-format'''&lt;br /&gt;
&lt;br /&gt;
Для указания в каком формате вывести результаты quality gate используйте опцию --out-format. Принимает значения text (человекочитаемый) и json. По умолчанию text&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Import_from_Svace&amp;diff=3016</id>
		<title>Help:Import from Svace</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Import_from_Svace&amp;diff=3016"/>
		<updated>2025-06-17T05:27:36Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Загрузка данных на сервер */  (update protobuf scheme)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI команды ==&lt;br /&gt;
  svacer import --svace &amp;lt;path-to-svace&amp;gt;&lt;br /&gt;
  svacer upload&lt;br /&gt;
&lt;br /&gt;
Эти две команды импортируют результаты анализа из '''.svace-dir''' в текущей директории и загрузят их на сервер Svacer по адресу '''localhost:8080'''.&lt;br /&gt;
&lt;br /&gt;
== Процесс импорта ==&lt;br /&gt;
Процесс импорта результатов работы статического анализатора Svace состоит из двух шагов:&lt;br /&gt;
# Дедупликация данных, предобработка, конвертирование во внутренний формат и сохранение результатов в промежуточном хранилище (svacer import).&lt;br /&gt;
# Загрузка данных из промежуточного хранилища на сервер (svacer upload).&lt;br /&gt;
&lt;br /&gt;
Можно импортировать результаты и из других статических анализаторов, поддерживающих [[Help:Sarif#Загрузка на сервер из SARIF|формат SARIF]].&lt;br /&gt;
&lt;br /&gt;
=== Промежуточное хранилище ===&lt;br /&gt;
Промежуточное хранилище используется для хранения результатов, подготовленных для загрузки на сервер. При импорте данных в промежуточное хранилище снимкам назначается уникальный ID, задается имя проекта и ветки. &lt;br /&gt;
Промежуточное хранилище можно использовать для аккумулирования результатов нескольких запусков анализатора, в том числе для различных проектов. &lt;br /&gt;
По умолчанию, промежуточное хранилище создается в директории '''.svacer-dir''' рядом с директорией '''.svace-dir.'''&lt;br /&gt;
Параллельный доступ к хранилищу из разных экземпляров Svacer '''не допускается'''. Если необходимо использовать разделяемое хранилище и конкурентный доступ, Svacer следует запускать в режиме удаленного промежуточного хранилища.&lt;br /&gt;
Процедура импорта c промежуточным хранилищем по умолчанию (размещается в '''&amp;lt;path to project&amp;gt;/.svacer-dir'''):&lt;br /&gt;
&lt;br /&gt;
    svacer import --svace &amp;lt;path to svace&amp;gt; [path to project]&lt;br /&gt;
&lt;br /&gt;
где '''&amp;lt;path to svace&amp;gt;''' — путь к исполняемому файлу svace из дистрибутива svace, '''[path to project]''' — путь к проекту (директории, содержащей .svace-dir). Его можно не указывать, тогда в качестве пути к проекту будет использована текущая директория.&lt;br /&gt;
&lt;br /&gt;
Процедура импорта с явным указанием размещения промежуточного хранилища:&lt;br /&gt;
&lt;br /&gt;
    svacer import --store &amp;lt;path to store&amp;gt; --svace &amp;lt;path to svace&amp;gt; &amp;lt;path to project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пользовательские атрибуты ===&lt;br /&gt;
При импорте данных можно ассоциировать пользовательские строковые атрибуты со снимком. Значения атрибутов доступно посредством публичного REST API и интерфейса командной строки. Это позволяет связать дополнительные данные с результатами (например commit ID). Пользовательские атрибуты нельзя модифицировать после импорта данных на сервер.&lt;br /&gt;
Пользовательские атрибуты экспортируются и импортируются как часть информации при использовании функциональности по экспорту и импорту снимков.&lt;br /&gt;
&lt;br /&gt;
Пользовательский атрибут может быть передан при использовании команды import посредством опции '''--field &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt;'''. Опция может быть указана несколько раз в командной строке.&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --field f1:val1 --field f2:val2 ...&lt;br /&gt;
&lt;br /&gt;
Если одно и тоже поле указано несколько раз, то значения поля сохраняются как JSON массив строк. &lt;br /&gt;
'''Допустимое имя''' пользовательского атрибута состоит из латинских букв, цифр, знаков подчеркивание или минуса.&lt;br /&gt;
&lt;br /&gt;
Для получения списка всех пользовательских атрибутов в JSON виде используется следующая команда в командной строке&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt;  --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''custom_fields'''&lt;br /&gt;
&lt;br /&gt;
Результат операции выдается как JSON объект в stdout. Объект имеет следующую структуру&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;field name1&amp;quot;:&amp;quot;value&amp;quot;,&lt;br /&gt;
    &amp;quot;field name2&amp;quot;: [&amp;quot;value&amp;quot;, &amp;quot;value&amp;quot;..]&lt;br /&gt;
    } &lt;br /&gt;
Для получения значения конкретного пользовательского атрибута используется следующая команда&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt;  --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''custom_fields --get &amp;lt;field name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Значение атрибута выводится в stdout как JSON строка или массив.&lt;br /&gt;
=== Клонирование ветки ===&lt;br /&gt;
При импорте данных возможно клонирование ветки (вместе со снимками, разметкой и комментариями) из того же проекта, куда происходит импорт данных.&lt;br /&gt;
&lt;br /&gt;
Для клонирования ветки следует использовать опцию '''--if-no-branch &amp;lt;value&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --if-no-branch &amp;lt;value&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Значения, которые может принимать опция '''--if-no-branch''':&lt;br /&gt;
&lt;br /&gt;
* '''clone-{name|id}''' — клонировать ветку с заданным именем|id (по умолчанию clone-master)&lt;br /&gt;
* '''create-empty''' — создает пустую ветку&lt;br /&gt;
* '''return-error''' — возвращает ошибку, если для опции '''--branch &amp;lt;branch_name&amp;gt;''' не существует ветки с именем branch_name&lt;br /&gt;
&lt;br /&gt;
{{Note}} Если не указать данную опцию, то будет автоматически клонироваться ветка master, поэтому для избежания ошибок следует убедиться, что ветка master существует, если данная опция не указана, иначе будет выведена ошибка.&lt;br /&gt;
&lt;br /&gt;
==== Клонирование разметки и комментариев ====&lt;br /&gt;
При импорте данных возможно клонирование разметки и комментариев ветки из того же проекта, куда происходит импорт данных.&lt;br /&gt;
&lt;br /&gt;
Для клонирования разметки и комментариев следует использовать опцию '''--clone-review {name|id}'''&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --clone-review {name|id} ...&lt;br /&gt;
&lt;br /&gt;
Данная опция принимает имя или id ветки, из которой необходимо склонировать разметку и комментарии.&lt;br /&gt;
&lt;br /&gt;
Приоритет опции '''--clone-review''' выше, чем у опции '''--if-no-branch''', поэтому возможно клонировать снимки из одной ветки, а разметку и комментарии из другой.&lt;br /&gt;
&lt;br /&gt;
Если ветка с таким именем или id не будет найдена, то при загрузке данных ('''svacer upload ...''', либо '''svacer import --upload ...''') загрузка произойдет, но без склонированной разметки.&lt;br /&gt;
&lt;br /&gt;
=== Прикрепление файлов ===&lt;br /&gt;
При импорте данных возможно прикрепление файлов размером до 300Мб к снимку. Файлы будут доступны пользователю в веб-интерфейсе и посредством интерфейса командной строки. Прикрепленные файлы фиксируются в момент операции импорта и не могут быть модифицированы после загрузки на сервер. Удалить файлы может администратор посредством веб интерфейса. Основное назначение данной функциональности прикрепление некоторой иммутабельной информации к результатам анализа для использования в интеграциях со сторонними системами.&lt;br /&gt;
Прикрепленные файлы являются частью данных, которые экспортируются и импортируются посредством функциональности экспорта и импорта снимков.&lt;br /&gt;
&lt;br /&gt;
Для прикрепления файлов следует использовать опцию '''--attach &amp;lt;file name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
    svacer import ... --attach file1.txt --attach file2.txt ...&lt;br /&gt;
&lt;br /&gt;
Опция может быть указана несколько раз. После загрузки данных на сервер файлы будут видимы в панели информации о снимке&lt;br /&gt;
&lt;br /&gt;
[[File:SnapshotInfo.png|none|alt=Snapshot Info Window]]&lt;br /&gt;
&lt;br /&gt;
Для получения списка файлов из командной строки  следует использовать команду&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt; --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''attachments''' --list&lt;br /&gt;
&lt;br /&gt;
Результат работы команды представляет собой JSON массив объектов вида&lt;br /&gt;
    &lt;br /&gt;
    [{&lt;br /&gt;
        &amp;quot;id&amp;quot;: 11,&lt;br /&gt;
        &amp;quot;snapshot_id&amp;quot;: &amp;quot;d99c23f7-9fb9-4f4e-85ac-2539328947e0&amp;quot;,&lt;br /&gt;
        &amp;quot;lid&amp;quot;: 122885,&lt;br /&gt;
        &amp;quot;short_name&amp;quot;: &amp;quot;Makefile&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;/home/ruseer/static-analysis/svacer/Makefile&amp;quot;,&lt;br /&gt;
        &amp;quot;created_by&amp;quot;: &amp;quot;importer&amp;quot;,&lt;br /&gt;
        &amp;quot;updated_by&amp;quot;: null,&lt;br /&gt;
        &amp;quot;create_ts&amp;quot;: &amp;quot;2022-10-18T06:41:54.532925Z&amp;quot;,&lt;br /&gt;
        &amp;quot;update_ts&amp;quot;: null,&lt;br /&gt;
        &amp;quot;checksum&amp;quot;: &amp;quot;9b1e02a276e810829ac2e38fb775c4ff8d269d0f44fd0fbae40f79a0320389ad&amp;quot;&lt;br /&gt;
    }]&lt;br /&gt;
    &lt;br /&gt;
Для получения содержимого файла из командной строки следует использовать команду&lt;br /&gt;
&lt;br /&gt;
    '''svacer access''' --project &amp;lt;project name&amp;gt;  --branch &amp;lt;branch name&amp;gt; --snapshot &amp;lt;name or id&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;password&amp;gt; '''attachments''' --get &amp;lt;id&amp;gt; &amp;lt;output file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Если '''&amp;lt;output file&amp;gt;''' не указан, то результат будет напечатан  в stdout;&lt;br /&gt;
* Если '''&amp;lt;branch&amp;gt;''' не указан, то будет использован ветка master;&lt;br /&gt;
* Если '''&amp;lt;snapshot&amp;gt;''' не указан, то будет использован последний снимок на указанной ветке.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка данных на сервер ===&lt;br /&gt;
{{Note|type=warn|text=При загрузке данных на сервер, а также при прочих взаимодействиях клиента Svacer с сервером Svacer, крайне рекомендуется, чтобы версия клиента совпадала с версией сервера. В случае несовпадения версий возможны непредсказуемые ошибки.}}&lt;br /&gt;
&lt;br /&gt;
Для загрузки данных из промежуточного хранилища на сервер используется команда '''upload''':&lt;br /&gt;
&lt;br /&gt;
    svacer upload --user &amp;lt;user&amp;gt; --password &amp;lt;pwd&amp;gt; --host &amp;lt;host&amp;gt; --port &amp;lt;rest_port&amp;gt; --grpc &amp;lt;grpc_port&amp;gt; &amp;lt;path_to_store&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если отсутствуют параметры:&lt;br /&gt;
* '''--user''' и '''--password''', то используется специальный системный пользователь '''importer''' — он предназначен для импорта данных на сервер;&lt;br /&gt;
* '''--host''', то используется '''locahost''';&lt;br /&gt;
* '''--port''' и '''--grpc''', то используются их значения по умолчанию;&lt;br /&gt;
При загрузке данных на сервер уже загруженные снимки повторно не загружаются. Разделяемая информация (такая как исходные файлы, где один и тот же файл может использоваться в различных анализах и т.п.) также повторно не загружается. &lt;br /&gt;
При сбоях в ходе загрузки проводится повторная загрузка, но при этом загружаются только недостающие данные.&lt;br /&gt;
&lt;br /&gt;
В случае если Svacer запущен с поддержкой SSL/TLS или работает за reverse proxy и доступен по протоколу HTTPS, то для загрузки требуется явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&lt;br /&gt;
    svacer upload --host https://&amp;lt;url_without_port&amp;gt; &amp;lt;path_to_store&amp;gt;&lt;br /&gt;
    svacer upload --ssl --host &amp;lt;url_without_port&amp;gt; &amp;lt;path_to_store&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом grpc порт (по умолчанию — 3002), по которому идет загрузка данных, на сервере должен быть доступен.&lt;br /&gt;
&lt;br /&gt;
Для информации о загрузке данных на сервер с авторизацией в LDAP см. [[LDAP configuration#Использование CLI сервера Svacer с поддержкой LDAP|Использование CLI Svacer с поддержкой LDAP]].&lt;br /&gt;
&lt;br /&gt;
При загрузке данных на сервер можно включить печать краткой статистики по загруженным результатам. Данная статистика включает информацию о новых и пропущенных предупреждениях, по сравнению с последним ранее загруженным снимком. Выдача краткой статистики возможно в текстовом или JSON виде. Результаты печатаются в stdout.&lt;br /&gt;
&lt;br /&gt;
    svacer upload ... --quick-stats --out-format text ...&lt;br /&gt;
&lt;br /&gt;
Пример вывода&lt;br /&gt;
    Quick Stats:&lt;br /&gt;
    Previous snapshot   : Snapshot 2022-11-16 10:11:37 +0300&lt;br /&gt;
    Current snapshot    : Snapshot 2022-11-16 10:23:08 +0300&lt;br /&gt;
    New                 : 1&lt;br /&gt;
    Missing             : 0&lt;br /&gt;
    Matched             : 1&lt;br /&gt;
    Same                : 0&lt;br /&gt;
&lt;br /&gt;
    svacer upload ... --quick-stats --out-format json ...&lt;br /&gt;
&lt;br /&gt;
Пример вывода&lt;br /&gt;
    {&amp;quot;branch&amp;quot;:&amp;quot;391f21d1-2173-449c-9d1a-dd846d2a6471&amp;quot;,&amp;quot;snapshot&amp;quot;:&amp;quot;34a1125d-86a3-45d3-9b41-cb5da24ab96e&amp;quot;,&amp;quot;snapshotName&amp;quot;:&amp;quot;Snapshot 2022-11-21 10:19:06 +0300&amp;quot;,&amp;quot;lastSnapshot&amp;quot;:&amp;quot;59657ae8-c3b6-48bc-b586-a6c0580cdb50&amp;quot;,&amp;quot;lastSnapshotName&amp;quot;:&amp;quot;Snapshot 2022-11-21 10:18:09 +0300&amp;quot;,&amp;quot;same&amp;quot;:2}&lt;br /&gt;
&lt;br /&gt;
Формат JSON определяется protobuf3 схемой (ряд полей носит внутренний характер):&lt;br /&gt;
 message ImportSummaryContext {&lt;br /&gt;
   string branch = 1;&lt;br /&gt;
   string snapshot = 2;&lt;br /&gt;
   string snapshotName = 9;&lt;br /&gt;
   string lastSnapshot = 3;  &lt;br /&gt;
   string lastSnapshotName = 4;  &lt;br /&gt;
   int64 new = 5;&lt;br /&gt;
   int64 missing = 6;&lt;br /&gt;
   int64 matched = 7;&lt;br /&gt;
   int64 same = 8;&lt;br /&gt;
   string qualityGate = 10;&lt;br /&gt;
   string baseline_branch_name = 11;&lt;br /&gt;
   string baseline_project_name = 12;&lt;br /&gt;
   string branch_name = 13;&lt;br /&gt;
   string project_name = 14;&lt;br /&gt;
   string project_id = 15;  &lt;br /&gt;
   string baseline_snapshot_id = 16;&lt;br /&gt;
   string baseline_branch_id = 19;&lt;br /&gt;
   string baseline_project_id = 20;&lt;br /&gt;
   string baseline_snapshot_name = 21;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
По умолчанию, если опция по указанию формата выдачи отсутствует, выдача идет в текстовом режиме.&lt;br /&gt;
&lt;br /&gt;
=== Переименование снимка после импорта ===&lt;br /&gt;
&lt;br /&gt;
При необходимости, имя загруженного снимка можно изменить. Данная опция поддерживается только для пользователей с правами администратора сервера.&lt;br /&gt;
&lt;br /&gt;
   svacer container snapshot rename --host &amp;lt;host&amp;gt; --port &amp;lt;port&amp;gt; --user &amp;lt;user name&amp;gt; --password &amp;lt;pwd&amp;gt; --id &amp;lt;snapshot id&amp;gt; --name &amp;lt;snapshot name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Идентификатор снимка можно посмотреть в веб-интерфейсе или получить посредством public API.&lt;br /&gt;
&lt;br /&gt;
=== Модификация путей в разметке при импорте ===&lt;br /&gt;
&lt;br /&gt;
==== Обычное поведение ====&lt;br /&gt;
По умолчанию пути к файлам не меняются, за исключением пути к папки '''.svace-dir''', он будет заменён на '''.build'''. Эту информацию можно увидеть при импорте проекта:&lt;br /&gt;
&lt;br /&gt;
    svacer import --clean .svacer-dir&lt;br /&gt;
    ...&lt;br /&gt;
    info    The path prefix of .svace-dir 'C:\work\generate_files\gen_exp' will be trimmed when converting file paths&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
После этого все маркеры из этой папки и дочерних будут в '''Review''' показывать путь вида '''/.build/test500_1.c''' вместо полного пути для файла '''C:\work\generate_files\gen_exp\test500_1.c'''.&lt;br /&gt;
&lt;br /&gt;
[[File:SimpleSourceCode.png|none|alt=Simple Source Code Window]]&lt;br /&gt;
&lt;br /&gt;
==== Использование --path-prefix ====&lt;br /&gt;
При необходимости модификацию по умолчанию можно заменить через '''--path-prefix'''.&lt;br /&gt;
Значения опции передаются в виде:&lt;br /&gt;
&lt;br /&gt;
    --path-prefix &amp;quot;prefix_for_replace1:value1;prefix_for_replace2:value2; ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Поддерживается как передача данных сразу в опцию, так и через указание файла содержащего значения. Разумно делать замены для унификации вида проекта, собранного на разных машинах (или из разных папок). При использовании файла допустимо размещать каждую замену на отдельную строчку.&lt;br /&gt;
&lt;br /&gt;
Префиксы путей заменяются только при полном совпадении (включая регистр, даже на Windows).&lt;br /&gt;
Для указания двоеточия в префиксе пути используется удвоенное двоеточие, к примеру (для показа преобразований добавлено  '''--debug'''):&lt;br /&gt;
&lt;br /&gt;
    svacer --debug import --clean --upload --path-prefix &amp;quot;C::\work:work&amp;quot; .svacer-dir&lt;br /&gt;
    ...&lt;br /&gt;
    INFO    Creating regular object store&lt;br /&gt;
    DEBUG   Creating path mapping rule 'C:\work' =&amp;gt; 'work'&lt;br /&gt;
    DEBUG   Creating path mapping rule 'C:/work' =&amp;gt; 'work'&lt;br /&gt;
    DEBUG   Creating path mapping rule '/C_/work' =&amp;gt; 'work'&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
После импорта на сервере можно увидеть файл: '''/work/generate_files/gen_exp/test500_1.c'''&lt;br /&gt;
&lt;br /&gt;
[[File:PathPrefixSourceCode.png|none|alt=PathPrefixSourceCode]]&lt;br /&gt;
&lt;br /&gt;
==== Использование --build-object @auto ====&lt;br /&gt;
При импорте конкретного файла *.svres исходный код может быть загружен, при указании опции '''--build-object @auto'''. В случае, если этот файл лежит в папке .svace-dir, исходный код будет взят из нее. При отсутствии папки .svace-dir файлы будут браться по абсолютным путям из файла *.svres.&lt;br /&gt;
Для указания конкретных директорий поиска подходящих файлов из *.svres следует использовать опцию '''--source-tree''', которую можно указать несколько раз, чтобы задать несколько корневых директорий. Поиск в этих директориях будет происходить только в случае, когда по путям из файла *.svres были найдены не все файлы. В случае успешного сопоставления, на сервер будут загружены соответствующие файлы из директории source tree.&lt;br /&gt;
&lt;br /&gt;
==== Использование --full-paths ====&lt;br /&gt;
Допустимо также полное отключение модификаций путей, для этого импорт надо производить с опцией '''--full-paths'''. Опция блокирует как модификацию по умолчанию '''.build''', так и явные указания через '''--path-prefix'''.&lt;br /&gt;
&lt;br /&gt;
    svacer --debug import --clean --upload --full-paths .svacer-dir&lt;br /&gt;
&lt;br /&gt;
После загрузки на сервере будет виден только полный путь: '''/C_/work/generate_files/gen_exp/test500_1.c'''.&lt;br /&gt;
&lt;br /&gt;
[[File:FullPathsSourceCode.png|none|alt=FullPathsSourceCode window]]&lt;br /&gt;
&lt;br /&gt;
Пути из Windows преобразуются в стиль Linux с небольшим преобразованием символов.&lt;br /&gt;
&lt;br /&gt;
=== Использование quality gate ===&lt;br /&gt;
&lt;br /&gt;
Возможна проверка новых, пропущенных, одинаковых, измененных предупреждений, для этого надо производить импорт с опцией '''--quality-gate'''.&lt;br /&gt;
&lt;br /&gt;
   --quality-gate value            Specify a quality gate. Format: stat_1:severity_1:N_1:[statuses_1],...,stat_k:severity_k:N_k:[statuses_k], stat takes values: new, missing, matched, same, total; severity takes the following values: all, critical, major, normal, minor, undefined, &amp;lt;detector name part&amp;gt;; N is a natural number; statuses - an optional field, specified in square brackets with a separator &amp;quot;;&amp;quot; possible values - confirmed, false_positive, wont_fix, unclear, undecided, when specifying statuses, the quality gate will be searched only for markers that have exactly these statuses, for example [confirmed;wont_fix;undecided]. If the severity of the number N is exceeded, it will out a warning. Also, as a value, you can specify a json or yaml file in which the quality gate is specified.&lt;br /&gt;
&lt;br /&gt;
Флаг принимает на вход тип предупреждений (stat), severity, их количество (N) и их статусы (statuses).&lt;br /&gt;
&lt;br /&gt;
* stat задает тип предупреждений. Возможные значения:&lt;br /&gt;
** '''new''' (присутствует в новом снимке, но отсутствует в старом)&lt;br /&gt;
** '''missing''' (присутствует в старом снимке, но отсутствует в новом)&lt;br /&gt;
** '''matched''' (присутствуют изменения в файлах не повлиявшие на выданное предупреждение)&lt;br /&gt;
** '''same''' (одинаковые)&lt;br /&gt;
** '''total''' (сумма всех вышеперечисленных)&lt;br /&gt;
* severity задается либо непосредственным его указанием ('''critical''', '''major''', '''normal''', '''minor''', '''undefined'''), либо '''all''' (все severity), либо частью имени детектора в формате postgres ILIKE https://www.postgresql.org/docs/current/functions-matching.html&lt;br /&gt;
* N - порог, после которого вызывается срабатывание. Не включает данное число (т.е. если указать 5, то при нахождении 6 и более вызывается срабатывание quality-gate)&lt;br /&gt;
* statuses - '''опциональное''' поле, в котором можно указать какие статусы (разметку) учитывать при нахождении предупреждений. Возможные значения '''confirmed''', '''false_positive''', '''wont_fix''', '''unclear''', '''undecided'''. Задаются в квадратных скобках с разделителем &amp;quot;;&amp;quot;. Например, [confirmed;wont_fix]. Если не указать данное поле, то будут учитываться все статусы. Принципы учета статусов:&lt;br /&gt;
** Если предупреждение размечено в новом снимке (значение не '''undecided'''), разметка берется из нового предупреждения&lt;br /&gt;
** Если в новом снимке нет разметки у данного предупреждения, а в старом есть, то берется разметка из старого предупреждения&lt;br /&gt;
** В остальных случаях у данного предупреждения разметка равна '''undecided'''.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 --quality-gate &amp;quot;total:critical:0:[confirmed;wont_fix],new:all:10&amp;quot;&lt;br /&gt;
Тогда опция сработает, если либо:&lt;br /&gt;
&lt;br /&gt;
1) статическим анализатором будут найдены общее количество предупреждений (новых, пропущенных, одинаковых, измененных) с '''severity:critical''' и статусами '''confirmed''' и '''won't fix'''&lt;br /&gt;
&lt;br /&gt;
2) статическим анализатором будут найдены новые предупреждения с любым статусом и severity&lt;br /&gt;
&lt;br /&gt;
Пример вывода:&lt;br /&gt;
 Quality gate exceed:&lt;br /&gt;
 Previous snapshot   : Snapshot 2025-06-16 15:37:09 +0300&lt;br /&gt;
 Current snapshot    : Snapshot 2025-06-16 15:37:39 +0300&lt;br /&gt;
 Stat                : total&lt;br /&gt;
 Severity            : Critical&lt;br /&gt;
 Severity Statuses   : confirmed wont_fix&lt;br /&gt;
 Severity Threshold  : 0&lt;br /&gt;
 Found Severity      : 3&lt;br /&gt;
Также quality-gate можно задать файлом в формате json или yaml (не yml).&lt;br /&gt;
&lt;br /&gt;
Пример json файла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[&amp;quot;total:all:1&amp;quot;, &amp;quot;total:proc:1&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример yaml файла:&lt;br /&gt;
  - &amp;quot;total:all:1&amp;quot;&lt;br /&gt;
  - &amp;quot;total:proc:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Флаг --quality-gate-exit-code ====&lt;br /&gt;
В случае срабатывания quality gate можно указать какой exit code будет возвращен&lt;br /&gt;
 --quality-gate-exit-code value                                       Specify the exit code of the application in the range from 0 to 125, which will be issued when the quality-gate is exceeded. The default is 0.&lt;br /&gt;
Принимает значения от 0 до 125 (по умолчанию 0)&lt;br /&gt;
&lt;br /&gt;
==== Флаг --quality-gate-verbose ====&lt;br /&gt;
Если необходимо выводить информацию и об успешно прошедших quality gate, то нужно добавить флаг --quality-gate-verbose, тогда в конце будет вывод успешно прошедших quality gate&lt;br /&gt;
&lt;br /&gt;
Пример вывода:&lt;br /&gt;
 Quality gate exceed:&lt;br /&gt;
 Previous snapshot   : Snapshot 2025-06-16 15:37:39 +0300&lt;br /&gt;
 Current snapshot    : Snapshot 2025-06-16 16:10:33 +0300&lt;br /&gt;
 Stat                : total&lt;br /&gt;
 Severity            : Critical&lt;br /&gt;
 Severity Statuses   : confirmed wont_fix&lt;br /&gt;
 Severity Threshold  : 0&lt;br /&gt;
 Found Severity      : 3&lt;br /&gt;
 The result of comparison of those who have completed quality gate:&lt;br /&gt;
 Previous snapshot   : Snapshot 2025-06-16 15:37:39 +0300&lt;br /&gt;
 Current snapshot    : Snapshot 2025-06-16 16:10:33 +0300&lt;br /&gt;
 Stat                : new&lt;br /&gt;
 Severity            : All&lt;br /&gt;
 Severity Threshold  : 10&lt;br /&gt;
 Found Severity      : 0&lt;br /&gt;
&lt;br /&gt;
==== Флаг --baseline ====&lt;br /&gt;
Если сравнение необходимо проводить не с предыдущим снимком в этой же ветке, то можно указать флаг '''--baseline''' (также работает для флага --quick-stats)&lt;br /&gt;
  --baseline value                                                     A snapshot to compare (--quality-gate and/or --quick-stats). Format: {project}:::{branch}:::{snapshot} or {project}:::{branch} or {project} use UUID or name. By default, snapshot is the last added, branch is master. If the flag is not specified, then the comparison will be with the latest snapshot from the branch where the snapshot is loaded.&lt;br /&gt;
Указывается в формате {project}:::{branch}:::{snapshot} или {project}:::{branch} или {project}, используя имена или UUID. По умолчанию используется ветка master (если указан только проект) и последний добавленный снимок (если снимок не указан).&lt;br /&gt;
&lt;br /&gt;
При указании данного флага меняется вывод:&lt;br /&gt;
&lt;br /&gt;
* В текстовом формате добавляются строки об имени проекта, ветки и снимка, с которым сравнивался загружаемый снимок.&lt;br /&gt;
* В json формате добавляются имена и id проекта,ветки и снимка, с которым сравнивался загружаемый снимок.&lt;br /&gt;
&lt;br /&gt;
'''Флаг --out-file'''&lt;br /&gt;
&lt;br /&gt;
Для указания файла, в который необходимо загрузить результаты quality gate, используете опцию --out-file (по умолчанию вывод идет в stdout)&lt;br /&gt;
&lt;br /&gt;
'''Флаг --out-format'''&lt;br /&gt;
&lt;br /&gt;
Для указания в каком формате вывести результаты quality gate используйте опцию --out-format. Принимает значения text (человекочитаемый) и json. По умолчанию text&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3008</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=3008"/>
		<updated>2025-06-03T09:41:04Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|version devel.2025-06-03@09:35:03.ab170f00&lt;br /&gt;
|&lt;br /&gt;
* Исправлена работа при репликации разметки между разными проектами/ветками&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* улучшено HTML представление отчета&lt;br /&gt;
* добавлены предикат match_prefix_re по аналогии с match_suffix_re&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты same_go_path и match_go_path для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3007</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3007"/>
		<updated>2025-06-02T08:58:02Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Match&amp;diff=3006</id>
		<title>Help:Match</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Match&amp;diff=3006"/>
		<updated>2025-06-02T08:57:23Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Классический режим генерации инвариантов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cопоставления предупреждений ==&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
В данной секции описывается алгоритм сопоставления предупреждений используемый Svacer для переноса разметки.&lt;br /&gt;
&lt;br /&gt;
Для каждого предупреждения в снимке (snapshot) вычисляется хэшкод из полей предупреждения и исходных файлов. В терминологии Svacer хэшкод именуется '''инвариантом'''. Инвариант используется для группировки предупреждений из разных снимков в рамках одной ветки. Каждое предупреждение в рамках '''одного снимка''' имеет '''уникальный''' инвариант.&lt;br /&gt;
&lt;br /&gt;
Генерация инвариантов для снимка идет по следующему алгоритму:&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (формируем первый, основной инвариант):&lt;br /&gt;
&lt;br /&gt;
* Пути всех файлов из предупреждений в снимке сортируются лексикографически.&lt;br /&gt;
* Для каждого пути вычисляется минимально возможный не конфликтующий суффикс пути (т. е. конец пути содержащий имя файла), имеющий по крайней мере два сегмента (т. е. включающий имя директории). Для Java файлов минимальный путь учитывает имя пакета, объявленного внутри файла (при наличии package declaration внутри). Данный минимальный суффикс добавляется в хэш код инварианта.&lt;br /&gt;
* В инвариант добавляются хэш коды следующих полей предупреждения: '''MTid''' (если поле пустое, то используются поля '''Msg''', '''warnClass'''), '''Function''', '''Lang''', '''Tool'''. Поля '''Lang''' и '''Tool''' нормализуются, т. к. разные версии Svace могли иметь отличные именования полей.&lt;br /&gt;
* Формируется хэш-код строки кода из объекта сборки. При формировании хэшкода строки все whitespace-ы игнорируются. Если объект сборки отсутствует, то используется поле '''details'''  у предупреждения.&lt;br /&gt;
* Если для нескольких предупреждений в снимке получился одинаковый инвариант, то конфликтующие предупреждения упорядочиваются по '''line''' и '''locID''' предупреждения (порядковый номер предупреждения в svres или sarif файле, в данном случае полагаемся на детерминизм анализатора). В инвариант добавляется индекс предупреждения в данной конфликтной группе. Таким образом получаем уникальный инвариант для каждого предупреждения в снимке.&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (формируем второй инвариант):&lt;br /&gt;
&lt;br /&gt;
* Пути всех файлов в снимке сортируются лексикографически.&lt;br /&gt;
* Для каждого пути вычисляется минимально возможный не конфликтующий путь, содержащий по крайней мере два сегмента (т. е. включающий имя директории). Для Java файлов минимальный путь учитывает имя пакета, объявленного внутри файла (при наличии package declaration внутри). Минимальный путь добавляется в хэш код инварианта.&lt;br /&gt;
* В инвариант добавляются хэш коды следующих полей предупреждения: '''MTid''' (если поле пустое, то используется поля '''Msg''', '''warnClass'''), '''Function''', '''Lang''', '''Tool''', '''Details''' (важное отличие от ''шага 1'' — здесь используется поле '''Details''' у предупреждения). Поля '''Lang''' и '''Tool''' нормализуются, т. к. разные версии Svace могли иметь отличные именования полей.&lt;br /&gt;
* Предупреждения в снимке делятся на группы по инварианту. В рамках одной группы предупреждения сортируются по '''Function''', строке ('''line''') и '''locID'''. Индекс предупреждения в группе добавляется к инварианту группы. Таким образом получаем уникальный инвариант для каждого предупреждения в снимке.&lt;br /&gt;
&lt;br /&gt;
Шаг 3:&lt;br /&gt;
&lt;br /&gt;
* Если предупреждения на ветке (branch) попали согласно ''инварианту 1'' в разные группы, а ''инварианту 2'' в одну, то для данных предупреждений будет использован ''инвариант 2'', как более строгий. &lt;br /&gt;
&lt;br /&gt;
Шаг 4:&lt;br /&gt;
&lt;br /&gt;
* Проверяется, были ли ручные сопоставления предупреждений на ветке (branch) и инварианты корректируются исходя из таблицы ручных сопоставлений. При ручном сопоставлении предупреждениям назначается уникальный инвариант и запоминается информация об эквивалентности назначенного инварианта инвариантам полученным на шагах 1 и 2.&lt;br /&gt;
&lt;br /&gt;
==== Правила нормализации полей Lang и Tool при импорте *.svres файлов ====&lt;br /&gt;
Для поля Lang выполняются следующие преобразования (ключ сравнивается как case-insensitive)&lt;br /&gt;
 		&amp;quot;C_Cpp&amp;quot;:       &amp;quot;CXX&amp;quot;,&lt;br /&gt;
 		&amp;quot;C&amp;quot;:           &amp;quot;CXX&amp;quot;,&lt;br /&gt;
 		&amp;quot;C#&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;KOTLIN&amp;quot;:      &amp;quot;KOTLIN&amp;quot;,&lt;br /&gt;
 		&amp;quot;cs&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;CS&amp;quot;:          &amp;quot;CSHARP&amp;quot;,&lt;br /&gt;
 		&amp;quot;Python&amp;quot;:      &amp;quot;PYTHON&amp;quot;,&lt;br /&gt;
 		&amp;quot;Go&amp;quot;:          &amp;quot;GO&amp;quot;,&lt;br /&gt;
 		&amp;quot;go&amp;quot;:          &amp;quot;GO&amp;quot;,&lt;br /&gt;
 		&amp;quot;Java&amp;quot;:        &amp;quot;JAVA&amp;quot;,&lt;br /&gt;
 		&amp;quot;VisualBasic&amp;quot;: &amp;quot;VISUALBASIC&amp;quot;,&lt;br /&gt;
 		&amp;quot;VB&amp;quot;:          &amp;quot;VISUALBASIC&amp;quot;,&lt;br /&gt;
 		&amp;quot;JS&amp;quot;:          &amp;quot;JAVASCRIPT&amp;quot;,&lt;br /&gt;
Поле Tool нормализуется к значениям из следующего списка посредством case-insensitive сравнения (если значение не из списка, то не меняется)&lt;br /&gt;
 	&amp;quot;SvEng&amp;quot;&lt;br /&gt;
 	&amp;quot;SvCpp&amp;quot;&lt;br /&gt;
 	&amp;quot;CSA&amp;quot;&lt;br /&gt;
 	&amp;quot;SpotBugs&amp;quot;&lt;br /&gt;
 	&amp;quot;TagsJavac&amp;quot;&lt;br /&gt;
 	&amp;quot;Roslyn&amp;quot;&lt;br /&gt;
 	&amp;quot;Kotlinc&amp;quot;&lt;br /&gt;
При импорте детекторов из sarif или искусственно созданном svres файле нормализация значения Tool не делается.&lt;br /&gt;
&lt;br /&gt;
=== Опции сервера, влияющие на алгоритм генерации инвариантов ===&lt;br /&gt;
&lt;br /&gt;
==== Отключение миграции инвариантов ====&lt;br /&gt;
Для отключения операции по пересчету и миграции инвариантов при старте можно использовать переменную окружения &lt;br /&gt;
 SVACER_NO_INVARIANT_MIGRATION=true&lt;br /&gt;
&lt;br /&gt;
При запуске сервера с данной опцией пересчет инвариантов происходить не будет.&lt;br /&gt;
&lt;br /&gt;
==== Отключение минимизации путей ====&lt;br /&gt;
При использовании следующей опции или соответствующей переменной окружения, механизм минимизации путей будет отключен.&lt;br /&gt;
 --no-path-min&lt;br /&gt;
&lt;br /&gt;
Переменная окружения:&lt;br /&gt;
 SVACER_NO_PATH_MIN=true|false&lt;br /&gt;
&lt;br /&gt;
==== Отключение шагов 2, 3 ====&lt;br /&gt;
Для отключения шагов 2 и 3 необходимо использовать переменную окружения&lt;br /&gt;
 SVACER_NO_MATCH_BY_CORE=true&lt;br /&gt;
{{Note}} Данная опция не рекомендуется, т. к. нарушает совместимость с алгоритмом генерации, используемом в прежних версиях Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Ручное сопоставление предупреждений (экспериментальная возможность) ===&lt;br /&gt;
Пользователь может выполнить ручное сопоставление предупреждений из [[Help:UI manual#Сопоставление маркеров|веб-интерфейса]] и CLI. В данной секции описывается механизм ручного сопоставления из CLI. &lt;br /&gt;
&lt;br /&gt;
Для ручного сопоставления предупреждений из CLI пользователь должен использовать команду &amp;lt;code&amp;gt;svacer marker match&amp;lt;/code&amp;gt;. Команда требует обязательной аутентификации и пользователь должен иметь права на разметку в проекте и ветке, где хочет выполнить сопоставление. Сопоставить можно предупреждения из '''разных''' снимков '''одной''' ветки. При ручном сопоставлении все предупреждения, которые эквивалентны по инвариантам первому предупреждению или второму, будут автоматически считаться эквивалентными. Одно и то же предупреждение может быть сопоставлено с множеством других предупреждений, но каждое из выбранных предупреждений должно находиться в различных снимках. Нельзя сопоставить два или более предупреждений из одного снимка одному предупреждению из другого снимка.&lt;br /&gt;
&lt;br /&gt;
 svacer marker match --user user --password password --host host --project project --branch branch --v1 snapshot1 --v2 snapshot2 id11=id21  id12=id22 id13=id23&lt;br /&gt;
 &lt;br /&gt;
Под аргументами операции подразумеваются пары ID маркеров из снимков указанных в параметрах &amp;lt;code&amp;gt;--v1&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;--v2&amp;lt;/code&amp;gt;. Для удобства пользователя, можно использовать числовой ID маркера, который может быть получен через CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password pwd --project project&lt;br /&gt;
&lt;br /&gt;
Формат задается опцией &amp;lt;code&amp;gt;--out-format=json|txt|csv&amp;lt;/code&amp;gt;. Если формат по умолчанию (txt), то данная команда выдает список предупреждений в виде таблицы&lt;br /&gt;
&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.&lt;br /&gt;
При указании опции &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; вывод будет направлен в указанный файл. &lt;br /&gt;
&lt;br /&gt;
В таблице первая колонка содержит числовой ID предупреждения, который может быть использован для сопоставления предупреждений. &lt;br /&gt;
&lt;br /&gt;
При использовании команды &amp;lt;code&amp;gt;svacer marker match&amp;lt;/code&amp;gt; пользователь может указывать как имя проекта и ветки, так и их ID.&lt;br /&gt;
&lt;br /&gt;
Для получения списка ручных сопоставлений пользователь должен использовать команду &amp;lt;code&amp;gt;svacer marker match-journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 svacer marker match-journal --host host --user user --password password --project project --branch branch&lt;br /&gt;
&lt;br /&gt;
Формат вывода контролируется опцией &amp;lt;code&amp;gt;--out-format&amp;lt;/code&amp;gt; и может быть &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt;, текст (&amp;lt;code&amp;gt;txt&amp;lt;/code&amp;gt;, default), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;. При указании опции &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; вывод будет направлен в указанный файл. &lt;br /&gt;
&lt;br /&gt;
 #  v   marker                        snapshot_id                           snapshot_name  created_by  create_ts&lt;br /&gt;
 2  v1  DEREF_OF_NULL.CONST:test.c:9  b51009b6-cdbe-463a-b324-c87143bb0372  S3             admin       Fri Mar 22 08:16:03 UTC 2024&lt;br /&gt;
    v2  DEREF_OF_NULL.CONST:test.c:8  8a9c4330-c131-44e1-bf09-b1d3a245b317  S1&lt;br /&gt;
 1  v1  DEREF_OF_NULL.CONST:test.c:8  3c20cd4e-e5d9-479b-b618-7db852ed0133  S2             admin       Fri Mar 22 08:01:06 UTC 2024&lt;br /&gt;
    v2  DEREF_OF_NULL.CONST:test.c:8  8a9c4330-c131-44e1-bf09-b1d3a245b317  S1&lt;br /&gt;
&lt;br /&gt;
Для отмены ручных сопоставлений пользователь должен использовать команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker unapply-match --host host --user user --password password --project project --branch branch id1 id2 id2 ...&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;code&amp;gt;id1, id2, ...&amp;lt;/code&amp;gt; — список id операций полученных командой &amp;lt;code&amp;gt;svacer marker match-journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} При отмене ручных сопоставлений вычисляется замыкание всех связанных сопоставлений и, далее, отменяется всё замыкание. Таким образом, если пользователь сопоставил два предупреждения, а потом одно из сопоставленных сопоставил с еще одним новым предупреждением, то при отмене первой операции будет отменена и вторая.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=2972</id>
		<title>Review replication</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Review_replication&amp;diff=2972"/>
		<updated>2025-05-26T08:45:56Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Репликация разметки по правилам (экспериментальная функциональность) ==&lt;br /&gt;
При использовании разных версий Svace (или иных анализаторов), разных настроек CI/CD и прочих факторах возможны ситуации, когда снимки (snapshots) в рамках одной ветки (branch) могут иметь различные инварианты и разметка автоматически не переносится. Для решения задачи переноса разметки в таких случаях разработана утилита '''reviewer''', которая позволяет применить декларативно описанные правила переноса к существующей разметке. В дальнейшем данная функциональность будет включена в Svacer и доступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
Использование утилиты подразумевает использование CLI команд &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt; ([[Markup2|описание markup2]]) для выгрузки и импортирования разметки. Утилита reviewer обеспечивает модификацию выгружаемой разметки с целью копирования существующей разметки на неразмеченные элементы. Правила копирования задаются с использованием булевых выражений и набора предопределенных предикатов.&lt;br /&gt;
&lt;br /&gt;
=== Описание утилиты ===&lt;br /&gt;
Утилита reviewer предназначена для Svacer версии 10 и выше. Утилита собрана под Linux, скачать можно [https://svacer.ispras.ru/releases/utils/reviewer отсюда].&lt;br /&gt;
&lt;br /&gt;
==== История изменений ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Версия&lt;br /&gt;
!Детали&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-05-26@06:18:01.853591f1&lt;br /&gt;
|&lt;br /&gt;
* улучшено HTML представление отчета&lt;br /&gt;
* добавлены предикат match_prefix_re по аналогии с match_suffix_re&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-22@06:39:21.a3bc1bc1&lt;br /&gt;
|&lt;br /&gt;
* Добавлены предикаты same_go_path и match_go_path для упрощения написания правил при переносе разметки для Go проектов, где версии модулей меняются&lt;br /&gt;
|-&lt;br /&gt;
|devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
|&lt;br /&gt;
* Добавлена версия&lt;br /&gt;
* Добавлена генерация журнала изменений&lt;br /&gt;
* Добавлена генерация информации о снимках при работе с сервером&lt;br /&gt;
* В результат записываются только обновленные разметки&lt;br /&gt;
* Добавлена возможность указания снимков в качестве фильтра (при условии работы с сервером)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer - Svacer review help tool&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 VERSION:&lt;br /&gt;
    devel.2025-04-21@04:53:47.15a3d5c0&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    syntax      Prints help information about rule syntax&lt;br /&gt;
    invariants  Get information about invariants from branch. Output format is ReviewModificationJournal.SnapshotList with invariants  &lt;br /&gt;
    replicate   Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
    help, h     Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug              Enabled debug output (default: false)&lt;br /&gt;
    --log-file value     Define log file for output&lt;br /&gt;
    --host value         Defines URL to svacer server. Format: &amp;lt;nowiki&amp;gt;http://host:port&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --user value         User login. When using env variable SVACER_AUTH_CREDS the format is SVACER_AUTH_CREDS=&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt; (default: admin) [$SVACER_AUTH_CREDS]&lt;br /&gt;
    --password value     User password&lt;br /&gt;
    --ldap_server value  Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --token value        Defines access token for svacer server [$SVACER_AUTH_TOKEN]&lt;br /&gt;
    --help               Show help (default: false)&lt;br /&gt;
    --version            Print version the program (default: false)&lt;br /&gt;
&lt;br /&gt;
Основная команда — '''replicate''', она позволяет применить декларативные правила к разметке, полученной либо с сервера, либо из файла, куда ранее была выгружена командой &amp;lt;code&amp;gt;svacer markup2 export&amp;lt;/code&amp;gt;. Результат работы команды — файл с разметкой, предназначенный для загрузки в Svacer посредством команды &amp;lt;code&amp;gt;svacer markup2 import&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    reviewer replicate - Replicate non-empty review to invariants according to rules.&lt;br /&gt;
                         Review can be loaded either from file(s) or from server. &lt;br /&gt;
 &lt;br /&gt;
                         Review is replicated from source project/branch or file to target project/branch or file.&lt;br /&gt;
 &lt;br /&gt;
                         If no target project/branch or file is specified, replication is applied to source project/branch or file. This can be used to copy review within the same container.&lt;br /&gt;
 &lt;br /&gt;
                         Result is written to stdout or file. Reviewer does not update data on server.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    reviewer replicate [command options] &amp;lt;file name&amp;gt; - path to result file&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value          Project name or id&lt;br /&gt;
    --branch value           Branch name or id (default: master)&lt;br /&gt;
    --target-project value   Project name or id of the target project&lt;br /&gt;
    --target-branch value    Branch name or id of the target branch (default: master)&lt;br /&gt;
    --source-snapshot value  Snapshot name or id. Replicate reviews only from given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --target-snapshot value  Snapshot name or id. Replicate reviews only to given snapshot. Host, project and branch must be provided&lt;br /&gt;
    --file value             Load review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --target-file value      Load target review from file instead of server. File must be in 'json with new line separator' format. File may be gzipped (must have *.gz extension)&lt;br /&gt;
    --rule value             Path to file containing replicate rules&lt;br /&gt;
    --html                   Produce HTML report describing applied changes. Report is saved to &amp;lt;result file name&amp;gt;.html (default: false)&lt;br /&gt;
    --verbose                Verbose output of rule applications (default: false)&lt;br /&gt;
    --process-all            Process all reviews, even with non-default values (default: false)&lt;br /&gt;
    --skip-comments          Skip comments while replicating review information (default: false)&lt;br /&gt;
    --skip-status            Skip review status and copy only comments while replicating review information (default: false)&lt;br /&gt;
    --journal value          Write journal of modifications to specified file&lt;br /&gt;
    --help                   Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Опция '''--journal''' позволяет указать файл, куда будет записана информация о проведенных изменениях в JSON формате. Пример такого файла&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;actions&amp;quot;: [&lt;br /&gt;
         {&lt;br /&gt;
             &amp;quot;source_invariant&amp;quot;: &amp;quot;LX/DOWQxqWSdqMw1zBGr/A&amp;quot;,&lt;br /&gt;
             &amp;quot;target_invariant&amp;quot;: &amp;quot;7YlVnmb/kAkwyxNBjCagiQ&amp;quot;,&lt;br /&gt;
             &amp;quot;rule&amp;quot;: &amp;quot;unprocessed() &amp;amp;&amp;amp;  // ensure target has no review\n        match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same\n        match_suffix_re (function, \&amp;quot;(.+/)\&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&amp;quot;,&lt;br /&gt;
             &amp;quot;source_id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
             &amp;quot;target_id&amp;quot;: &amp;quot;13&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ]&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
=== Шаги применения утилиты ===&lt;br /&gt;
'''Задача:''' в проекте myproject на ветке master необходимо перенести существующую разметку по некоторым правилам. Сервер запущен на localhost на порту 8080.&lt;br /&gt;
&lt;br /&gt;
'''Шаги решения:'''&lt;br /&gt;
&lt;br /&gt;
1. Опционально, но рекомендуется выгрузить разметку с ветки в файл, используя команду&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin export --project myproject --branch master --uncompressed --format json --export-all /tmp/myproject.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Написать правила переноса разметки (предикатов переноса) в файл &amp;lt;code&amp;gt;/tmp/map.txt&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3. Если разметка была выгружена (шаг 1 выполнен), то применить утилиту reviewer '''с загрузкой данных из файла'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 reviewer replicate --file /tmp/myproject.json --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&lt;br /&gt;
&lt;br /&gt;
4. Если разметка не была выгружена (шаг 1 пропущен) применить утилиту reviewer '''с загрузкой данных с сервера'''. Флаг &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt; создаст дополнительно HTML с информацией об изменениях, имя файла &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;. Журнал изменений будет записан в файл &amp;lt;code&amp;gt;replicate_journal.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;reviewer --host=http://localhost:8080 --user admin --password admin replicate --project myproject --branch master --rule /tmp/map.txt --journal /tmp/replicate_journal.json --html /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Проанализировать созданный журнал изменений и файл &amp;lt;code&amp;gt;/tmp/out.json.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Если результат устраивает, то загрузить обновленную разметку в сервер из файла &amp;lt;code&amp;gt;/tmp/out.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer markup2 --host=http://localhost:8080 --user admin --password admin import --project myproject --branch master /tmp/out.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечания'''&lt;br /&gt;
&lt;br /&gt;
Разметка в Svacer привязана к инвариантам. Инвариант это некоторый хэш, формируемый из полей предупреждения. Алгоритм формирования хэша описан в [[Help:Match#Описание алгоритма|этой статье]]. В рамках одного снимка все инварианты всегда уникальны.&lt;br /&gt;
&lt;br /&gt;
Команда &amp;lt;code&amp;gt;markup2 export&amp;lt;/code&amp;gt; с флагом &amp;lt;code&amp;gt;--export-all&amp;lt;/code&amp;gt; выгружает все инварианты с ветки с информацией о разметке и комментариях. &lt;br /&gt;
&lt;br /&gt;
При экспорте разметка на инварианте представлена как объект, соответствующий схеме, описанной в статье [[Markup2]]. Технически это:  &lt;br /&gt;
&lt;br /&gt;
* статус (тройка &amp;lt;code&amp;gt;status, severity, action&amp;lt;/code&amp;gt;)&lt;br /&gt;
* набор комментариев &lt;br /&gt;
* массив locations, которые определяют множество мест, имеющих один и тот же инвариант&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм переноса разметки ===&lt;br /&gt;
Входные данные (разметка), полученные из файла или с сервера разбиваются на два вектора source и target. В source включаются все элементы с разметкой, отличной от разметки по умолчанию. В target включаются все оставшиеся элементы. Порядок элементов в source и target соответствует порядку объектов во входных данных (файле). &lt;br /&gt;
&lt;br /&gt;
Если указана опция &amp;lt;code&amp;gt;--process-all&amp;lt;/code&amp;gt; , то в source и target включаются все элементы (данную опцию следует использовать для случаев, если мы хотим заместить существующую разметку, а не перенести разметку на неразмеченные элементы)&lt;br /&gt;
&lt;br /&gt;
Процедура проходит по всем парам &amp;lt;code&amp;gt;(source_item,target_item)&amp;lt;/code&amp;gt; и для каждой пары вычисляет предикаты из файла с правилами в порядке их определения. Если какой-либо предикат вычислен в true, то происходит копирование статусов разметки  и комментариев с &amp;lt;code&amp;gt;source_item&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt;. Во избежание перезаписи разметки можно в правилах использовать предикат &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; описанный ниже.&lt;br /&gt;
&lt;br /&gt;
==== Файл задания предикатов переноса ====&lt;br /&gt;
Формат файла: UTF-8. Правила разделяются &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt;. В качестве комментариев допустимы &amp;lt;code&amp;gt;/**/&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила — это булевы выражение в синтаксисе [https://expr-lang.org/docs/language-definition go-expr],  выражения использует операторы &amp;lt;code&amp;gt;&amp;amp;&amp;amp;, ||, !&amp;lt;/code&amp;gt;, скобки и следующие дополнительные предикаты: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;unprocessed()&amp;lt;/code&amp;gt; — проверка, что target еще не содержит разметки. Рекомендуется использовать, чтобы избежать перезаписи разметки, если несколько правил сработали; при наличии такого предиката разметка будет скопирована лишь один раз для первого сработавшего предиката;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;processed()&amp;lt;/code&amp;gt; — проверка, что target уже содержит какую-либо не дефолтную разметку;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations в source и target хотя бы один общий location, который совпадает по указанным полям. Возможные поля: &amp;lt;code&amp;gt;warnclass, function, details, invariant, line, file, mtid, tool, lang&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_loc_strict(field1, field2, ...)&amp;lt;/code&amp;gt; — проверка, содержат ли locations source и target одинаковые location по указанным полям;&lt;br /&gt;
&lt;br /&gt;
:Пример: &amp;lt;code&amp;gt;match_loc_strict(warnclass,file,lang,tool,line)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в source запись, где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_re(field, value)&amp;lt;/code&amp;gt; — проверка, содержит ли location в target запись где field совпадает с value. Value — Golang regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка source соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review(status[, severity, action])&amp;lt;/code&amp;gt; — проверка, если разметка target соответствует указанным параметрам. &amp;lt;code&amp;gt;severity, action&amp;lt;/code&amp;gt; можно опускать, шаблон &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; соответствует всему;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в source есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;   &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_range(lower_bound,upper_bound)&amp;lt;/code&amp;gt; — проверка, если в target есть location, где line попадает в указанный диапазон. Значение &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; означает отсутствие границы;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_suffix_re(field, source_prefix[,target_prefix])&amp;lt;/code&amp;gt; — проверка, есть ли location в source и target, который содержит общий суффикс. Суффикс вычисляется путем отрезания префикса source_prefix и target_prefix. Если target_prefix не указан, то считается, что он равен source_prefix. Префикс определяется как Go regexp;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_source_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id source разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;match_target_id(id1, id2, ...)&amp;lt;/code&amp;gt; — проверка, если внутренний id target разметки совпадает с одним из аргументов;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_review_ct() time.Time&amp;lt;/code&amp;gt; — возвращает время создания разметки в target;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в source;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_reviewed_by() string&amp;lt;/code&amp;gt; — возвращает автора разметки в target.&lt;br /&gt;
&lt;br /&gt;
==== Пример ====&lt;br /&gt;
 // Перенос разметки для Go, где поменялся формат поля function в последних Svace&lt;br /&gt;
 &lt;br /&gt;
 unprocessed() &amp;amp;&amp;amp;  // ensure target has no review&lt;br /&gt;
         match_loc(warnclass,file,lang,tool,mtid, line) &amp;amp;&amp;amp; // ensure main fields are the same&lt;br /&gt;
         match_suffix_re (function, &amp;quot;(.+/)&amp;quot; /* regexp for prefix */ ) // trim prefix and match suffix&lt;br /&gt;
&lt;br /&gt;
==== HTML отчет о результатах переноса ====&lt;br /&gt;
При использовании опции &amp;lt;code&amp;gt;--html&amp;lt;/code&amp;gt;утилита формирует HTML файл с информацией о разметке и операциях по переносу. Файл предназначен для отладки процесса переноса. В будущем, в Svacer UI будет предусмотрен специальный интерфейс для просмотра результатов переноса. &lt;br /&gt;
[[File:ReviewerHTML1.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При наличии переноса разметки в столбце с Review будет запись Review Source со ссылкой на элемент, откуда была перенесена разметка.&lt;br /&gt;
[[File:ReviewerHTMLReport2.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
При раскрытии элемента Review Source будут представлены основные поля location, соответствующих исходной разметке, откуда был сделан перенос.&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2944</id>
		<title>Markup2</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2944"/>
		<updated>2025-05-19T06:38:47Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Описание команд импорта, экспорта и копирования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public REST API для экспорта, импорта и копирования разметки ==&lt;br /&gt;
Релиз 10.х Svacer включает новый API, предназначенный для экспорта, импорта и копирования разметки.&lt;br /&gt;
&lt;br /&gt;
Релиз 11.х Svacer добавил журнал групповых операций связанных с импортом разметки и возможность отката внесенных изменений. Для журнала групповых операций доступно public API.&lt;br /&gt;
&lt;br /&gt;
 # Импорт, экспорт и копирование разметки&lt;br /&gt;
 POST /api/public/markup/import&lt;br /&gt;
 POST /api/public/markup/export&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
 &lt;br /&gt;
 # Работа с журналом групповых операций по разметки&lt;br /&gt;
 GET /api/public/markup/list_operations&lt;br /&gt;
 DELETE /api/public/markup/list_operations&lt;br /&gt;
 POST /api/public/markup/undo&lt;br /&gt;
&lt;br /&gt;
Разметка описывается посредством protobuf схемы:&lt;br /&gt;
&lt;br /&gt;
 // Represents exported review (review itself + comments)&lt;br /&gt;
 // Review is associated with invariant and has list of locations&lt;br /&gt;
 message Review { &lt;br /&gt;
   &lt;br /&gt;
   // Defines model for concrete location of the review&lt;br /&gt;
   message Location {            &lt;br /&gt;
     string warnClass = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     uint32 line = 3;&lt;br /&gt;
     string details = 4;&lt;br /&gt;
     string mtid = 5;&lt;br /&gt;
     string function = 10;&lt;br /&gt;
     bytes content_hash = 6;&lt;br /&gt;
     bytes trace_hash = 7;&lt;br /&gt;
     bytes marker_hash = 8;&lt;br /&gt;
     bytes line_hash = 9;    &lt;br /&gt;
     string tool = 11;&lt;br /&gt;
     string lang = 12;&lt;br /&gt;
   }  &lt;br /&gt;
   // Defines model for comment&lt;br /&gt;
   message Comment {      &lt;br /&gt;
     string text = 1;&lt;br /&gt;
     optional string format = 2;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 3;&lt;br /&gt;
     optional google.protobuf.Timestamp update_ts = 4;&lt;br /&gt;
     string createdBy = 5;      &lt;br /&gt;
     string origin_id = 6;   &lt;br /&gt;
     optional uint64 review_id = 7; // refers to Review.id field&lt;br /&gt;
     optional string created_by_id = 8;&lt;br /&gt;
   }&lt;br /&gt;
   // Defines model for review itself&lt;br /&gt;
   message ReviewData {&lt;br /&gt;
     string status = 1;&lt;br /&gt;
     string severity = 2;&lt;br /&gt;
     string action = 3;&lt;br /&gt;
     string origin_id = 4;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 5;&lt;br /&gt;
     string created_by = 6;&lt;br /&gt;
     optional string created_by_id = 7;&lt;br /&gt;
     optional string created_from = 8;&lt;br /&gt;
   }  &lt;br /&gt;
   // Invariant of the marker&lt;br /&gt;
   string invariant = 1; &lt;br /&gt;
   // Review information associated with markers having given invariant&lt;br /&gt;
   optional ReviewData review_data = 2;  &lt;br /&gt;
   // List of comments associated with all markers having given invariant&lt;br /&gt;
   repeated Comment comments = 3; &lt;br /&gt;
   // List of locations associated with given invariant. Locations can be used to apply fuzzy matching of review with existing data when there is no invariant match  &lt;br /&gt;
   repeated Location locations = 4;&lt;br /&gt;
   // Export-specific ID, comments can refer to this id if comment is associated with review operation&lt;br /&gt;
   uint64 id = 5;&lt;br /&gt;
   // Meta-information about export, when exporting to file field is initialized only for the first element&lt;br /&gt;
   optional ReviewExportMeta meta = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Defines meta-information about exported review&lt;br /&gt;
 message ReviewExportMeta {&lt;br /&gt;
   message Container {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string name = 2;&lt;br /&gt;
   }  &lt;br /&gt;
   google.protobuf.Timestamp create_ts = 1; // timestamp when export was produced (UTC)&lt;br /&gt;
   string created_by = 2; // user who triggered export&lt;br /&gt;
   string svacer_version = 3;  // svacer version&lt;br /&gt;
   optional Container project = 4; // source container (project)&lt;br /&gt;
   optional Container branch = 5; // source container (branch)&lt;br /&gt;
   map&amp;lt;string,string&amp;gt; properties = 6; // extra properties&lt;br /&gt;
 }&lt;br /&gt;
Актуальную версию схемы можно получить из Svacer по API: &amp;lt;code&amp;gt;GET /api/public/markup/schema&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=При сериализации в JSON используются proto-имена полей. При работе с данными из Go рекомендуется использовать [https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson protojson] для сериализации и десериализации.}}&lt;br /&gt;
&lt;br /&gt;
Svacer поддерживает два формата для экспортирования/импортирования разметки:&lt;br /&gt;
&lt;br /&gt;
* JSON с разделением по newline-ам. Каждая строка представляет собой объект типа '''Review''' (указано выше) сериализованный в JSON&lt;br /&gt;
* Бинарный формат: последовательность блоков &amp;lt;code&amp;gt;[lenght little endian][proto]&amp;lt;/code&amp;gt;, где первый блок содержит длину следующего блока в формате &amp;lt;code&amp;gt;u32 little endian&amp;lt;/code&amp;gt;, а второй блок содержит proto-сериализацию объекта '''Review'''&lt;br /&gt;
&lt;br /&gt;
В обоих случаях при выгрузке разметки первый элемент типа '''Review''' будет содержать мета-информацию об исходном контексте, откуда была выгружена разметка.&lt;br /&gt;
&lt;br /&gt;
Разметка привязывается к инварианту маркера и может содержать собственно разметку (статус маркера) и совокупность комментариев, связанных с данным маркером. При выгрузке разметки также добавляется информация о конкретных локациях предупреждений, ассоциированных с инвариантом. В будущих версиях данная информация будет использоваться для переноса разметки при отсутствии прямого совпадения инвариантов.&lt;br /&gt;
&lt;br /&gt;
=== Экспорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/export&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''body''' запроса&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API и экспорт разметки из ветки, откуда производится экспорт&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;format&amp;quot;: &amp;quot;&amp;lt;json|proto&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;export_all&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;compressed&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;filters&amp;quot; : [ {&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;lt;regular expression&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;ids&amp;quot;: [&amp;quot;&amp;lt;snapshot id&amp;gt;&amp;quot;, &amp;quot;&amp;lt;snapshot id&amp;gt;&amp;quot;]&lt;br /&gt;
      }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Пользователь должен указать либо '''source''' элемент, либо '''source_id'''&lt;br /&gt;
* Опция '''skip_comments''' позволяет игнорировать комментарии при выгрузке разметки&lt;br /&gt;
* Опция '''skip_review''' позволяет игнорировать статусы маркеров при выгрузке разметки (т. е. выгружать только комментарии)&lt;br /&gt;
* Опция '''export_all''' позволяет выгрузить пустую разметку (т. е. статусы Undecided/Unspecified/Undecided). Это позволяет получить список всех инвариантов для ветки и использовать данные для генерации требуемой разметки для импорта&lt;br /&gt;
* Метод возвращает gzipped файл содержащий разметку в указанном формате если &amp;lt;code&amp;gt;compressed = true&amp;lt;/code&amp;gt;&lt;br /&gt;
* Поле &amp;lt;code&amp;gt;filters&amp;lt;/code&amp;gt; позволяет указать набор фильтров для снимков. Все фильтры применяются по принципу AND.  Поле &amp;lt;code&amp;gt;pattern&amp;lt;/code&amp;gt; в фильтре задает фильтрацию по имени снимка, поле &amp;lt;code&amp;gt;ids&amp;lt;/code&amp;gt; — по ID снимков.&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/import&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''query''' запроса&lt;br /&gt;
* Запрос должен быть формата '''multipart/form-data''', поле '''file''' должно содержать файл с разметкой&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на импорт разметки. Если пользователь '''не имеет''' атрибута '''review master''', то перезапись текущей разметки от '''review master''' не будет производится (т. е. обычный пользователь не сможет изменить разметку review master-а через импорт).&lt;br /&gt;
&lt;br /&gt;
Query параметры:&lt;br /&gt;
&lt;br /&gt;
 project — &amp;lt;project name&amp;gt; — имя проекта&lt;br /&gt;
 branch — &amp;lt;branch name&amp;gt; — имя бранча&lt;br /&gt;
 target_id — &amp;lt;branch id&amp;gt; — id бранча. Должно быть либо id бранча, либо имя проекта + имя бранча. Приоритет — id бранча&lt;br /&gt;
 format — &amp;lt;proto|json&amp;gt; — формат импортируемой разметки. Если не указан, будет определяться автоматически&lt;br /&gt;
 overwrite — &amp;lt;none|force|last&amp;gt; — по умолчанию last — контролирует логику применения разметки к бранчу при импорте&lt;br /&gt;
 skip_comments — &amp;lt;true|false&amp;gt; — по умолчанию false — игнорировать комментарии&lt;br /&gt;
 skip_review — &amp;lt;true|false&amp;gt; — по умолчанию false — игнорировать статус разметки (импорт только комментариев)&lt;br /&gt;
 response_with_result — &amp;lt;true|false&amp;gt; — вернуть детальный список разметок, которые были применены, в формате JSON с newline-разделителями. Если не указан, то возвращается краткий статус&lt;br /&gt;
 compressed — &amp;lt;true|false&amp;gt; — формат файла с разметкой, если true то подразумевается gzip-compressed файл&lt;br /&gt;
&lt;br /&gt;
Настоятельно рекомендуется явно указывать параметр '''overwrite'''.&lt;br /&gt;
&lt;br /&gt;
В случае успеха метод возвращает body со следующими данными:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
Первая строка body содержит JSON с информацией о выполненных действиях. Если был указан параметр '''response_with_result''', то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм импорта ====&lt;br /&gt;
&lt;br /&gt;
* Блокируются операции по разметке и импорту на целевой бранч&lt;br /&gt;
* Выгружается текущая разметка бранча с комментариями&lt;br /&gt;
* Загруженная разметка сопоставляется с текущей и формируется список разметки для применения. Дублирующая разметка и комментарии игнорируются&lt;br /&gt;
* Перезапись разметки контролируется параметром '''overwrite'''. Если значение '''none''', то разметка не перезаписывается при наличии разметки в целевом бранче. Если значение '''force''', то разметка будет перезаписана. Если значение '''last''', то разметка будет перезаписана, если загруженная разметка имеет более новую дату&lt;br /&gt;
* Пустая разметка (Undecided/Unspecified/Undecided) явным образом не применяется к инварианту, если разметка отсутствует на бранче&lt;br /&gt;
* Сформированный список применяется к бранчу. При выборе маркера, куда добавлять комментарий, выбирается маркер из наиболее раннего снимка, где маркер с соответствующим инвариантом появился&lt;br /&gt;
&lt;br /&gt;
'''Допустимые значения полей разметки:'''&lt;br /&gt;
&lt;br /&gt;
* Status — &amp;lt;code&amp;gt;&amp;quot;Confirmed&amp;quot;, &amp;quot;Won't fix&amp;quot;, &amp;quot;False Positive&amp;quot;, &amp;quot;Unclear&amp;quot;, &amp;quot;Undecided&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Severity — &amp;lt;code&amp;gt;&amp;quot;Unspecified&amp;quot;, &amp;quot;Critical&amp;quot;, &amp;quot;Major&amp;quot;, &amp;quot;Minor&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Action — &amp;lt;code&amp;gt;&amp;quot;Undecided&amp;quot;, &amp;quot;Fix required&amp;quot;, &amp;quot;Fix submitted&amp;quot;, &amp;quot;Ignore&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Копирование разметки ===&lt;br /&gt;
&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''body''' запроса&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API, экспорт снимков (для исходной ветки), импорт разметки (для целевой ветки), разрешения '''Update any review''' и '''Update any comment''' (для перезаписи разметки и комментариев ревью мастера)&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;target&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;target_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false&amp;gt; — по умолчанию false,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false&amp;gt; — по умолчанию false,&lt;br /&gt;
     &amp;quot;overwrite&amp;quot;: &amp;quot;&amp;lt;none|last|force&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;response_with_result&amp;quot;: &amp;lt;true|false&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
В случае успеха, метод возвращает body со следующими данными&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
Первая строка body содержит JSON с информацией о выполненных действиях. Если был указан параметр '''response_with_result''', то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
== Журнал групповых операций (для версии 11.х.х и выше) ==&lt;br /&gt;
Импорт разметки а также использование групповой разметки (из UI или посредством API) фиксирует операции в журнале групповых операций. Для работы с журналом доступно public REST API:&lt;br /&gt;
&lt;br /&gt;
 # Получения списка групповых операций&lt;br /&gt;
 GET /api/public/markup/list_operations&lt;br /&gt;
&lt;br /&gt;
 # Удаление записи из журнала групповых операций&lt;br /&gt;
 DELETE /api/public/markup/list_operations&lt;br /&gt;
&lt;br /&gt;
 # Отмена изменений, внесенных групповой операцией&lt;br /&gt;
 POST /api/public/markup/undo&lt;br /&gt;
&lt;br /&gt;
Описание параметров доступно в Swagger.&lt;br /&gt;
&lt;br /&gt;
Семантика операции Undo следующая:&lt;br /&gt;
&lt;br /&gt;
* Разметка, внесенная групповой операцией, удаляется. Если она была активной, то ставится предыдущая активная разметка&lt;br /&gt;
* Комментарии, внесенные групповой операцией, будут удалены только если они не модифицировались после групповой операции&lt;br /&gt;
* По умолчанию при отмене операции происходит проверка, является ли она последней групповой операцией на данной ветке. Если она не является последней, то будет ошибка (для принудительной отмены используется параметр &amp;lt;code&amp;gt;check_order&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Статус разметок может меняться в зависимости от порядка применений нескольких операций Undo&lt;br /&gt;
&lt;br /&gt;
Для экономии памяти рекомендуется периодически удалять записи из журнала групповых операций.&lt;br /&gt;
&lt;br /&gt;
== CLI API для импорта/экспорта/копирования разметки ==&lt;br /&gt;
&lt;br /&gt;
Данное API является '''экспериментальным''' и может меняться. Основные аргументы будут сохранены. По умолчанию команды под '''markup2''' скрыты. Использовать можно, указывая их явно. Для получения помощи запустить:&lt;br /&gt;
&lt;br /&gt;
 # Импорт, экспорт, копирование разметки&lt;br /&gt;
 svacer markup2 --help&lt;br /&gt;
 svacer markup2 copy --help&lt;br /&gt;
 svacer markup2 import --help&lt;br /&gt;
 svacer markup2 export --help&lt;br /&gt;
&lt;br /&gt;
 # Работа с журналом групповых операций&lt;br /&gt;
 svacer markup2 list --help&lt;br /&gt;
 svacer markup2 undo --help&lt;br /&gt;
 svacer markup2 delete --help&lt;br /&gt;
&lt;br /&gt;
=== Описание работы с журналом групповых операций ===&lt;br /&gt;
При использовании операций по импорту разметки или использовании API/UI для выполнения групповых операций по разметке информация о выполненных операциях будет занесена в журнал групповых операций. Журнал фиксирует дату, пользователя и все внесенные изменения: изменение самой разметки и добавленные комментарии.&lt;br /&gt;
&lt;br /&gt;
===== Просмотр журнала операций =====&lt;br /&gt;
 svacer markup2 --host &amp;lt;host url&amp;gt; --user admin --password admin list&lt;br /&gt;
&lt;br /&gt;
 id  status   target                               action         description                                                                                                                                                                                                                         ts                                    user      &lt;br /&gt;
 94  APPLIED  local/b1                             import-review  import comments as part of raw result import                                                                                                                                                                                        2025-04-24 13:19:30.675 +0300 MSK     admin     &lt;br /&gt;
 91  APPLIED  bash/master                          batch-review   batch review operation                                                                                                                                                                                                              2025-04-18 16:09:17.963822 +0300 MSK  admin     &lt;br /&gt;
 89  APPLIED  dxr-test/master                      batch-review   batch review operation                                                                                                                                                                                                              2025-04-18 14:21:42.82489 +0300 MSK   admin     &lt;br /&gt;
 87  APPLIED  Lua_clone2/v5.3                      copy-review    copy review from 61c4290b-d06a-484f-b980-8d7cbb660fb4 to 0588686d-a1da-4f11-b948-d07a9d12fb60                                                                                                                                       2025-04-18 12:57:09.49 +0300 MSK      admin     &lt;br /&gt;
 86  APPLIED  Lua_clone1/v5.3                      import-review  import review by request from WEB or REST API; client address: 10.10.168.102:52020, user agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 YaBrowser/25.2.0.0 Safari/537.36  2025-04-18 12:54:17.239 +0300 MSK     admin     &lt;br /&gt;
 85  APPLIED  Lua/v5.3                             batch-review   batch review operation                          &lt;br /&gt;
&lt;br /&gt;
===== Отмена операции =====&lt;br /&gt;
 svacer markup2 --host localhost:8080 --user admin --password admin undo --id=94&lt;br /&gt;
&lt;br /&gt;
 2025-05-14T11:47:33.559+0300    info    Log file location /tmp/svacer-client-2025-05-14.log&lt;br /&gt;
 2025-05-14T11:47:33.560+0300    info    Scheme not found in the provided host (localhost:8080), assume 'http'&lt;br /&gt;
 2025-05-14T11:47:33.560+0300    info    Querying server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2025-05-14T11:47:33.560+0300    info    Server version: [11-0-0]&lt;br /&gt;
 2025-05-14T11:47:33.599+0300    info    Unapplied batch review operations [94]&lt;br /&gt;
&lt;br /&gt;
===== Удаление записей из журнала =====&lt;br /&gt;
{{Note|type=warn|text=Удаление записей из журнала не отменяет внесенных изменений (т. е. разметки и комментариев), но после удаления записей из журнала отмена соответствующих изменений будет невозможна}}&lt;br /&gt;
&lt;br /&gt;
Для удаления можно использовать разный набор условий&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 delete - Delete entries from batch review operation list. ATTENTION: you cannot undo batch operation if you remove it&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 delete [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 DESCRIPTION:&lt;br /&gt;
    When multiple flags are used to specify conditions, all conditions will be applied in order: --id, (--from, --to), --keep-last-n&lt;br /&gt;
    Flag --last will override values of --from and --to&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --id value [ --id value ]  ID of the batch operation&lt;br /&gt;
    --from value               Set start date for the report. Expected format '2006-01-02 15:04:05' in local timezone&lt;br /&gt;
    --to value                 Set end date for the report. Expected format '2006-01-02 15:04:05' in local timezone&lt;br /&gt;
    --last value               Delete operations for the specified last period of time. Possible values: @hour, @day, @week, @month, @year&lt;br /&gt;
    --keep-last-n value        Keep last N entries (default: 0)&lt;br /&gt;
    --help                     Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Пример: оставим последние 10 операций в журнале&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --host localhost:8080 --user admin --password admin delete --keep-last-n 10&lt;br /&gt;
&lt;br /&gt;
 2025-05-14T11:51:31.121+0300    info    Log file location /tmp/svacer-client-2025-05-14.log&lt;br /&gt;
 2025-05-14T11:51:31.121+0300    info    Scheme not found in the provided host (localhost:8080), assume 'http'&lt;br /&gt;
 2025-05-14T11:51:31.121+0300    info    Querying server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2025-05-14T11:51:31.122+0300    info    Server version: [11-0-0]&lt;br /&gt;
 2025-05-14T11:51:31.146+0300    info    Deleted 37 entries from the list&lt;br /&gt;
&lt;br /&gt;
=== Описание команд импорта, экспорта и копирования ===&lt;br /&gt;
 NAME:&lt;br /&gt;
   svacer markup2 - CLI API for exporting, importing and copying review information&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    import   Import markup from file and apply to specified branch&lt;br /&gt;
    export   Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
    copy     Copy markup between branches&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --ssl                 Connect to the server using https protocol (default: false)&lt;br /&gt;
    --ssl-ca-certs value  Trusted CA cert path. Example: /usr/local/certs/* , /usr/local/certs/ca.crt, /usr/local/certs/ca*.crt&lt;br /&gt;
    --user value          Valid user name&lt;br /&gt;
    --password value      Valid user password&lt;br /&gt;
    --oidc-client value   ClientID for login with OpenID Connect protocol&lt;br /&gt;
    --oidc-secret value   Client's secret for login with OpenID Connect protocol&lt;br /&gt;
    --host value          Valid host name with running svace history server (default: localhost) [$SVACER_HOST_NAME]&lt;br /&gt;
    --port value          Defines port for REST API (default: 8080) [$SVACER_API_PORT]&lt;br /&gt;
    --grpc value          Defines port for gRPC API (default: 3002) [$SVACER_GRPC_PORT]&lt;br /&gt;
    --ldap_server value   Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --conn_file value     Use connection file [$SVACER_CONN_FILE]&lt;br /&gt;
    --dry-run             Do actions but don't commit result to database (default: false)&lt;br /&gt;
    --help                Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
==== Импорт разметки из файла ====&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 import - Import markup from file and apply to specified branch&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 import [command options] &amp;lt;file&amp;gt; - path to file to import. If file is not specified, data is loaded from stdin&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Target project name&lt;br /&gt;
    --branch value     Target branch name&lt;br /&gt;
    --branch-id value  Target branch ID&lt;br /&gt;
    --skip-review      Import comments only (default: false)&lt;br /&gt;
    --skip-comments    Import review only (default: false)&lt;br /&gt;
    --overwrite value  Overwrite mode: none, force, last&lt;br /&gt;
    --out value           Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out         Include information about applied reviews (default: false)&lt;br /&gt;
    --format value        Specify explicit format for data. If not specified, format will be detected from content&lt;br /&gt;
    --description value   Specify optional description the given import operation. If not specified, unique ID will be generated based on hostname, user and time&lt;br /&gt;
    --generated-by value  Optional tool generated review information&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
При импорте разметки используя флаги &amp;lt;code&amp;gt;--description&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;--generated-by&amp;lt;/code&amp;gt; можно задать дополнительную информацию, связанную с данной разметкой. Она будет занесена в журнал операций импорта.&lt;br /&gt;
&lt;br /&gt;
==== Экспорт разметки в файл ====&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 export - Export markup to file or stdout. Command needs either branch ID or project and branch name.  Use --snapshot-id and --snapshot to filter results by snapshots (filters are applied by AND rule)&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 export [command options] &amp;lt;file name or empty&amp;gt; - if no file name is specified, result is printed to stdout&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value                              Source project name&lt;br /&gt;
    --branch value                               Source branch name. Branch name will be resolved against source project (default: master)&lt;br /&gt;
    --branch-id value                            Source branch ID&lt;br /&gt;
    --skip-review                                Export comments only (default: false)&lt;br /&gt;
    --skip-comments                              Export review only (default: false)&lt;br /&gt;
    --format value                               Format: json or proto. If format is not specified, proto is used. If output file is not specified and format is not specified, json will be used.&lt;br /&gt;
    --uncompressed                               Get data in raw format without gzip compression (default: false)&lt;br /&gt;
    --export-all                                 Export empty (undecided) review (default: false)&lt;br /&gt;
    --snapshot-id value [ --snapshot-id value ]  Filter results by snapshots with specified IDs. When using --snapshot flag, results will be filtered by name pattern as well&lt;br /&gt;
    --snapshot value                             Filter results by snapshots matching pattern. Pattern is matched against snapshot name. When using --snapshot-id flag, results will be filtered by ID as well&lt;br /&gt;
    --help    &lt;br /&gt;
&lt;br /&gt;
Для экспорта разметки из конкретных снимков можно использовать флаги &amp;lt;code&amp;gt;--snapshot-id&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Копирование разметки ====&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 copy - Copy markup between branches&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 copy [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --target-project value    Target project name&lt;br /&gt;
    --target-branch value     Target branch name&lt;br /&gt;
    --target-branch-id value  Target branch ID&lt;br /&gt;
    --source-project value    Source project name&lt;br /&gt;
    --source-branch value     Source branch name&lt;br /&gt;
    --source-branch-id value  Source branch ID&lt;br /&gt;
    --skip-review             Copy comments only (default: false)&lt;br /&gt;
    --skip-comments           Copy review only (default: false)&lt;br /&gt;
    --overwrite value         Overwrite mode: none, force, last&lt;br /&gt;
    --out value               Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out             Include information about applied reviews (default: false)&lt;br /&gt;
    --help                    Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
==== Примеры использования ====&lt;br /&gt;
 svacer markup2 --user admin --password admin copy --overwrite=force --source-project bash --target-project bash  --source-branch master --target-branch bash_clone &lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Log file location /tmp/svacer-1543671068.log&lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:19:41.745+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --user admin --password admin import --overwrite=force --project bash --branch bash_clone  /tmp/out.json &lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Log file location /tmp/svacer-1480510331.log&lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:20:17.435+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Log file location /tmp/svacer-1792255677.log&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T15:46:06.810+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;invariant&amp;quot;:&amp;quot;+1vB4JXkME3AAcbXR7tezA&amp;quot;, &amp;quot;review_data&amp;quot;:{&amp;quot;status&amp;quot;:&amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;:&amp;quot;Unspecified&amp;quot;, &amp;quot;action&amp;quot;:&amp;quot;Undecided&amp;quot;, &amp;quot;create_ts&amp;quot;:&amp;quot;2024-10-16T14:44:07.233554Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;created_from&amp;quot;:&amp;quot;1c8cea92-7708-4bb9-9a88-40325f39efe8&amp;quot;}, &amp;quot;locations&amp;quot;:[{&amp;quot;warnClass&amp;quot;:&amp;quot;PROC_USE.VULNERABLE&amp;quot;, &amp;quot;file&amp;quot;:&amp;quot;/.build/jobs.c&amp;quot;, &amp;quot;line&amp;quot;:4207, &amp;quot;details&amp;quot;:&amp;quot;b043c5a63bf9d432c816f2cb421c907fe912bf16&amp;quot;, &amp;quot;mtid&amp;quot;:&amp;quot;SvEng.L.1&amp;quot;, &amp;quot;function&amp;quot;:&amp;quot;run_sigchld_trap&amp;quot;, &amp;quot;content_hash&amp;quot;:&amp;quot;s4AMYzKR8Ol8k4OODPpOlPUsSWI=&amp;quot;, &amp;quot;marker_hash&amp;quot;:&amp;quot;XiVQmRu8HmhzOnq1+XY7AaujT+o=&amp;quot;, &amp;quot;tool&amp;quot;:&amp;quot;SvEng&amp;quot;, &amp;quot;lang&amp;quot;:&amp;quot;C_Cpp&amp;quot;}], &amp;quot;id&amp;quot;:&amp;quot;699&amp;quot;, &amp;quot;meta&amp;quot;:{&amp;quot;create_ts&amp;quot;:&amp;quot;2024-11-15T12:46:06.835078490Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;svacer_version&amp;quot;:&amp;quot;devel.2024-11-15@15:45:34.a290bc7e&amp;quot;, &amp;quot;project&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;0fd645aa-8e70-4a4f-b68b-766c4f337bf2&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;}, &amp;quot;branch&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;8925df5a-7a98-4f07-bc88-ee4ea5b43813&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;}}}&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=2943</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=2943"/>
		<updated>2025-05-19T05:32:44Z</updated>

		<summary type="html">&lt;p&gt;Ruseer: /* Release 11-0-0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 11-0-0 ===&lt;br /&gt;
май 2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлен [[Help:Match#Классический режим генерации инвариантов|режим работы]] сервера где генерация инвариантов для переноса разметки соответствует режиму Svacer &amp;lt;=8.x.x. Режим включается через опции &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; или переменную окружения &amp;lt;code&amp;gt;SVACER_CLASSIC_INV_MODE=true|false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения.&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt;с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Ruseer</name></author>
	</entry>
</feed>