<?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=Gribunin</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=Gribunin"/>
	<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Special:Contributions/Gribunin"/>
	<updated>2026-04-15T08:56:00Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3471</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3471"/>
		<updated>2026-03-19T13:33:12Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup примеры&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле опцией &amp;lt;code&amp;gt;snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет выполнено через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация об удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность доступна пользователям с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --cleanup-type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 240h&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20 --keep-time 12h&lt;br /&gt;
&lt;br /&gt;
В любом проекте в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков; остальные снимки старше 12 часов будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, ветка &amp;quot;master&amp;quot; будет удаляться, если в ней нет снимков.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|none|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3470</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3470"/>
		<updated>2026-03-19T13:12:35Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup в пример добавлено keep-time&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле опцией &amp;lt;code&amp;gt;snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет выполнено через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация об удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность доступна пользователям с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --cleanup-type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20 --keep-time 0h&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, ветка &amp;quot;master&amp;quot; будет удаляться, если в ней нет снимков.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|none|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3469</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3469"/>
		<updated>2026-03-19T13:08:24Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup примеры исправление&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле опцией &amp;lt;code&amp;gt;snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет выполнено через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация об удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность доступна пользователям с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --cleanup-type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, ветка &amp;quot;master&amp;quot; будет удаляться, если в ней нет снимков.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|none|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=3468</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=3468"/>
		<updated>2026-03-11T10:02:22Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: automigrate skip-exist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--edit-markers) ===&lt;br /&gt;
При импорте снимка с использованием --edit-markers можно модифицировать маркеры более гибко, см [[Edit markers (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
Флаг '''skip-exist''' — укажите данный флаг, чтобы не возвращать ошибку, если паттерн уже существует. Применяется для команды &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Personal Access Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Access Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. Параметры &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ttl&amp;lt;/code&amp;gt; обязательны. TTL указывается в днях&lt;br /&gt;
 svacer server token create --name token_name --ttl day_to_live --details more_info&lt;br /&gt;
* Просмотреть список созданных токенов&lt;br /&gt;
 svacer server token list&lt;br /&gt;
* Удалить токен&lt;br /&gt;
 svacer server token delete --id token_id&lt;br /&gt;
* Управлять токенами других пользователей (требуется наличие прав по управлению пользователями)&lt;br /&gt;
 svacer server token admin list --user user_id_or_login — получение списка токенов пользователя&lt;br /&gt;
 svacer server token admin delete --id token_id — удаление токена&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на создаваемые токены — нельзя с помощью такого токена создавать другие токены. Каждый пользователь может создавать токены также через public API: &amp;lt;code&amp;gt;/api/public/personal_token&amp;lt;/code&amp;gt;. См. описание swagger.&lt;br /&gt;
&lt;br /&gt;
Управлять токенами также можно в [[Help:UI manual#Управление токенами доступа|UI Svacer]].&lt;br /&gt;
&lt;br /&gt;
Созданные токены можно в дальнейшем использовать в качестве значения переменной окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&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;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&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;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3463</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3463"/>
		<updated>2026-02-09T07:57:47Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: changelog add retry-policy&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;
* Исправлены проблемы безопасности, связанные с импортом данных и механизмом токенов доступа (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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Import_from_Svace&amp;diff=3459</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=3459"/>
		<updated>2026-01-30T14:53:52Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: baseline-check&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;
{{Note|text=Для корректной работы опций &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;--quick-stats&amp;lt;/code&amp;gt; при использовании reverse proxy, в частности Nginx, для gRPC порта Svacer, необходимо в настройках секции http или server добавить инструкцию:&lt;br /&gt;
 underscores_in_headers on;&lt;br /&gt;
См. [[Help:Configuration#Nginx|пример конфига]]}}&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), либо частью имени детектора в формате [https://www.postgresql.org/docs/current/functions-matching.html postgres ILIKE]&lt;br /&gt;
* N — порог, после которого вызывается срабатывание. Не включает данное число (т. е. если указать 5, то при нахождении 6 и более вызывается срабатывание quality-gate)&lt;br /&gt;
* statuses — '''опциональное''' поле, в котором можно указать какие статусы (разметку) учитывать при нахождении предупреждений. Возможные значения '''confirmed''', '''false_positive''', '''wont_fix''', '''unclear''', '''undecided'''. Задаются в квадратных скобках с разделителем &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;. Например &amp;lt;code&amp;gt;[confirmed;wont_fix]&amp;lt;/code&amp;gt;. Если не указать данное поле, то будут учитываться все статусы. При указании в command line рекомендуется значение опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt; экранировать в двойные кавычки.&amp;lt;br /&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;
&lt;br /&gt;
# Cтатическим анализатором будут найдены общее количество предупреждений (новых, пропущенных, одинаковых, измененных) с '''severity:critical''' и статусами '''confirmed''' и '''won't fix'''&lt;br /&gt;
# Cтатическим анализатором будут найдены новые предупреждения с любым статусом и 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;
&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;
{{Note|text=Для корректной работы опций &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;--quick-stats&amp;lt;/code&amp;gt; при использовании reverse proxy, в частности Nginx, для gRPC порта Svacer, необходимо в настройках секции http или server добавить инструкцию:&lt;br /&gt;
 underscores_in_headers on;&lt;br /&gt;
См. [[Help:Configuration#Nginx|пример конфига]]}}&lt;br /&gt;
&lt;br /&gt;
==== Флаг --quality-gate-exit-code ====&lt;br /&gt;
В случае срабатывания quality gate можно указать какой exit code от 0 до 125 будет возвращен. &lt;br /&gt;
&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;
&lt;br /&gt;
{{Note|text=Значение по умолчанию 0, поэтому без явного задания exit code срабатывание quality-gate не вернет ненулевой статус и при использовании в CI/CD pipeline не будет помечен как failed. Так сделано для упрощения внедрения quality-gate опции в существующий CI/CD. Вначале можно проанализировать логи и если данные корректны, добавить опцию &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, то нужно добавить флаг &amp;lt;code&amp;gt;--quality-gate-verbose&amp;lt;/code&amp;gt;&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;
Если сравнение необходимо проводить не с предыдущим снимком в этой же ветке, то можно указать флаг &amp;lt;code&amp;gt;--baseline&amp;lt;/code&amp;gt; (также работает для флага &amp;lt;code&amp;gt;--quick-stats&amp;lt;/code&amp;gt;).&lt;br /&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;
&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;
&lt;br /&gt;
Если baseline не может быть точно определен (ошибка в имени проекта, ветки и т. п.), то импорт не производится и выдается ошибка.&lt;br /&gt;
&lt;br /&gt;
==== Флаг --baseline-check ====&lt;br /&gt;
Для вывода quick-stats и quality-gate даже в случае отсутствия снимка, ветки или проекта используйте опцию &amp;lt;code&amp;gt;--baseline-check&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный флаг принимает следующие параметры:&lt;br /&gt;
&lt;br /&gt;
* пустой или 'project,branch,snapshot' (требует проект, ветку и снимок, по умолчанию)&lt;br /&gt;
* 'skip' (разрешает отсутствие проекта, ветки, снимка)&lt;br /&gt;
* 'project' (требует проект, разрешает отсутствие ветки и снимка)&lt;br /&gt;
* 'project,branch' (требует проект и ветку, разрешает отсутствие снимка)&lt;br /&gt;
&lt;br /&gt;
Можно использовать полные названия с запятыми или сокращения без запятых: 'p' для project, 'b' для branch, 's' для snapshot, например 'pbs'. Всегда пытается найти снимок; если он не найден, то использует пустой baseline (и все предупреждения помечаются как New). Ошибка возвращается только если не выполнен обязательный уровень.&lt;br /&gt;
&lt;br /&gt;
==== Флаг --out-file ====&lt;br /&gt;
&lt;br /&gt;
Для указания файла, в который необходимо вывести результаты quality gate, используйте опцию &amp;lt;code&amp;gt;--out-file&amp;lt;/code&amp;gt; (по умолчанию вывод идет в stdout).&lt;br /&gt;
&lt;br /&gt;
==== Флаг --out-format ====&lt;br /&gt;
&lt;br /&gt;
Для указания в каком формате вывести результаты quality gate используйте опцию &amp;lt;code&amp;gt;--out-format&amp;lt;/code&amp;gt;. Принимает значения text (человекочитаемый) и json. По умолчанию text.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3445</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3445"/>
		<updated>2025-12-16T09:53:43Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup change description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле опцией &amp;lt;code&amp;gt;snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет выполнено через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация об удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность доступна пользователям с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --cleanup-type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|none|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3444</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3444"/>
		<updated>2025-12-16T09:36:25Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup remove min-snapshots for exclude-rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет выполнено через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация об удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --cleanup-type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|none|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3355</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=3355"/>
		<updated>2025-11-19T09:05:36Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: edit-markers change descriptions to more correct description&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-dedup2.png&amp;diff=3354</id>
		<title>File:Edit-markers-dedup2.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-dedup2.png&amp;diff=3354"/>
		<updated>2025-11-19T08:56:27Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-dedup2&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-dedup.png&amp;diff=3353</id>
		<title>File:Edit-markers-dedup.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-dedup.png&amp;diff=3353"/>
		<updated>2025-11-19T08:47:04Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-dedup&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3342</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=3342"/>
		<updated>2025-11-18T18:13:38Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: edit-markers change descriptions to more correct description&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&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;
  {&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один: случайным образом выберется один из них и у него будет объединенный trace всех остальных маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и его trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3341</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3341"/>
		<updated>2025-11-18T17:38:07Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: small cleanup changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет выполнено через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация об удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --cleanup-type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3322</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=3322"/>
		<updated>2025-11-17T16:37:26Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: add info edit-markers version snapshot&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3321</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=3321"/>
		<updated>2025-11-17T15:44:34Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Примеры */&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-marker.png&amp;diff=3320</id>
		<title>File:Edit-marker.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-marker.png&amp;diff=3320"/>
		<updated>2025-11-17T15:44:19Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-marker&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3319</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=3319"/>
		<updated>2025-11-17T15:42:04Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Примеры */&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
=== Изменение класса предупреждений ===&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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3318</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=3318"/>
		<updated>2025-11-17T15:40:36Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Примеры */&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
=== Изменение класса предупреждений ===&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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Bash.zip&amp;diff=3317</id>
		<title>File:Bash.zip</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Bash.zip&amp;diff=3317"/>
		<updated>2025-11-17T15:39:23Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: bash snapshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
bash snapshot&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3316</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=3316"/>
		<updated>2025-11-17T15:37:56Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Работа с регулярными выражениями */&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Все примеры используют снимок 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;
=== Изменение класса предупреждений ===&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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3315</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=3315"/>
		<updated>2025-11-17T15:37:36Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Работа с регулярными выражениями */&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Все примеры используют снимок 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;
=== Изменение класса предупреждений ===&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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-8.png&amp;diff=3314</id>
		<title>File:Edit-markers-8.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-8.png&amp;diff=3314"/>
		<updated>2025-11-17T15:37:17Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-8&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3313</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=3313"/>
		<updated>2025-11-17T15:36:57Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Примеры */  edit-markers&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Все примеры используют снимок 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;
=== Изменение класса предупреждений ===&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;
'''Серьезность, Надежность и CWE привязаны к названию warnclass (детектора), поэтому, если указать''' '''несуществующий warnclass, то данные поля пропадут.'''&lt;br /&gt;
&lt;br /&gt;
=== Удаление дубликатов ===&lt;br /&gt;
Если необходимо объединить несколько детекторов в один по одинаковым полям, то возможно сделать следующее действие (в качестве полей rules можно указать 8 возможных значений, см. описание deduplicate):&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&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Тогда все маркеры, которые находятся в одном файле и с одним warnclass объединятся в один (случайным образом выберется один) и у него будет объединенный trace всех остальным маркеров.&lt;br /&gt;
[[File:Edit-markers-4.png|center|thumb|961x961px]]&lt;br /&gt;
Для данного примера видно, что все маркеры из файла &amp;lt;code&amp;gt;/.build/alias.c&amp;lt;/code&amp;gt; объединились в один (так как у них был один warnclass) и их trace содержит все записи других маркеров. Аналогично произошло и с остальными маркерами, которые находились в одном файле и имели одинаковые warnclass.&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;/.build/builtins&amp;lt;/code&amp;gt;, а также у них расширение не &amp;lt;code&amp;gt;c, cpp, h, hpp&amp;lt;/code&amp;gt; (то есть оставляем только те маркеры, которые находятся в папке &amp;lt;code&amp;gt;/.build/builtins&amp;lt;/code&amp;gt; с расширением &amp;lt;code&amp;gt;c, cpp, h, hpp&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;
&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-51.png&amp;diff=3312</id>
		<title>File:Edit-markers-51.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-51.png&amp;diff=3312"/>
		<updated>2025-11-17T15:07:55Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-51&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-5.png&amp;diff=3311</id>
		<title>File:Edit-markers-5.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-5.png&amp;diff=3311"/>
		<updated>2025-11-17T15:04:32Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-5&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-4.png&amp;diff=3310</id>
		<title>File:Edit-markers-4.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-4.png&amp;diff=3310"/>
		<updated>2025-11-17T14:10:13Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-4&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-3.png&amp;diff=3309</id>
		<title>File:Edit-markers-3.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-3.png&amp;diff=3309"/>
		<updated>2025-11-17T14:02:31Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-3&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-2.png&amp;diff=3308</id>
		<title>File:Edit-markers-2.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-2.png&amp;diff=3308"/>
		<updated>2025-11-17T13:46:43Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-2&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-1.png&amp;diff=3307</id>
		<title>File:Edit-markers-1.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Edit-markers-1.png&amp;diff=3307"/>
		<updated>2025-11-17T13:37:27Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;edit-markers-1&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3306</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=3306"/>
		<updated>2025-11-14T15:39:50Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: edit markers descriptions change&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Объединяет маркеры с одинаковыми значениями указанных полей.&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;
&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;icontains(file, 'test') or icontains(file, 'spec')&amp;quot;&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE' and icontains(file, 'generated')&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;INFO&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;
&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&amp;quot;&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 == '.build/src/generated.c'&amp;quot;&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,function&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 ['DEBUG', 'TRACE', 'INFO'] 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;LOW_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;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;regex(file, \&amp;quot;.*_test\\\\.(c|cpp)$\&amp;quot;)&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass in ['UNREACHABLE_CODE.ENUM', 'UNREACHABLE_CODE.RET', 'UNUSED_VALUE.PARAM_ASSIGN']&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;contains(file, 'generated') or contains(file, '.build') 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;
Фильтрация по сложным паттернам путей:&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;regex(file, \&amp;quot;^(tests?|spec|mock|stub)/.*$\&amp;quot;) or nregex(file, \&amp;quot;^src/.*\\.(c|cpp|h|hpp)$\&amp;quot;)&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;
  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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3303</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3303"/>
		<updated>2025-11-13T14:30:00Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: changelog 12&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
December?&lt;br /&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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3271</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3271"/>
		<updated>2025-11-10T08:50:15Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: small cleanup changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит по-умолчанию раз в 24 часа (время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;, но не меньше 15 минут). Первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация о удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --min-snapshots &amp;lt;min&amp;gt; --type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней).&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Svacer&amp;diff=3225</id>
		<title>Svacer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Svacer&amp;diff=3225"/>
		<updated>2025-11-05T09:51:00Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: указано svace ver. checkers для Релизов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Svacer — сервер для хранения и обработки результатов статического анализа. Поддерживает импорт результатов анализа из [https://svace.ispras.ru Svace] напрямую и из прочих анализаторов через формат [[Help:Sarif|SARIF]].&lt;br /&gt;
&lt;br /&gt;
=== Документация ===&lt;br /&gt;
Version 11.x.x&lt;br /&gt;
# [[Help:Introduction|Введение]]&lt;br /&gt;
# [[Help:Installation|Установка и обновление]]&lt;br /&gt;
# [[Help:Import from Svace|Импорт из Svace]]&lt;br /&gt;
# [[Help:Backup|Резервное копирование]]&lt;br /&gt;
# [[Help:UI manual|Использование веб-интерфейса]]&lt;br /&gt;
# [[Help:Public API|Public REST API]]&lt;br /&gt;
# [[Help:CLI|CLI]]&lt;br /&gt;
# [[LDAP configuration|LDAP]]&lt;br /&gt;
# [[OIDC|OpenID Connect]]&lt;br /&gt;
# [[Help:Sarif|SARIF]]&lt;br /&gt;
# [[Help:Statistics|Статистика]]&lt;br /&gt;
# [[Help:Match|Механизмы сопоставления предупреждений и переноса разметки]]&lt;br /&gt;
# [[Help:XSvacer|XSvacer — расширение функциональности Svacer]]&lt;br /&gt;
# [[Help:Utils|Дополнительные утилиты]]&lt;br /&gt;
# [[Metrics|Prometheus-метрики]]&lt;br /&gt;
# [[Pipelines|Примеры пайплайнов]]&lt;br /&gt;
# [[Notifications|Уведомления]]&lt;br /&gt;
&lt;br /&gt;
=== Релизы ===&lt;br /&gt;
Также доступны в виде docker-образа на [https://hub.docker.com/r/ispras/svacer docker hub] и как пакеты в [[Help:Installation#Установка и запуск из deb/rpm пакета|репозиториях]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! version !! distrib !! linux bin !! windows bin !! deb/rpm !! doc&lt;br /&gt;
!svace ver. checkers&lt;br /&gt;
|-&lt;br /&gt;
| 11.2.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-2-0/svacer-11-2-0-linux.tar.gz svacer-11-2-0-linux.tar.gz]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-2-0/svacer-11-2-0-windows.zip svacer-11-2-0-windows.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-2-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-2-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-2-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-2-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-2-0/svacer_11.2-0_amd64.deb svacer_11.2-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-2-0/svacer-11.2-0.x86_64.rpm svacer-11.2-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 11-2-0|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#Обновление|Upgrade notes]]&amp;lt;br /&amp;gt;[[Svacer#Документация|Documentation 11.x.x]]&lt;br /&gt;
|4.0.250415&lt;br /&gt;
|-&lt;br /&gt;
| 11.1.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-1-0/svacer-11-1-0-linux.tar.gz svacer-11-1-0-linux.tar.gz]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-1-0/svacer-11-1-0-windows.zip svacer-11-1-0-windows.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-1-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-1-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-1-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-1-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-1-0/svacer_11.1-0_amd64.deb svacer_11.1-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-1-0/svacer-11.1-0.x86_64.rpm svacer-11.1-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 11-1-0|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#Обновление|Upgrade notes]]&amp;lt;br /&amp;gt;[[Svacer#Документация|Documentation 11.x.x]]&lt;br /&gt;
|4.0.250415&lt;br /&gt;
|-&lt;br /&gt;
| 11.0.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-0-0/svacer-11-0-0-linux.tar.gz svacer-11-0-0-linux.tar.gz]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-0-0/svacer-11-0-0-windows.zip svacer-11-0-0-windows.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-0-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-0-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-0-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-0-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-11-0-0/svacer_11.0-0_amd64.deb svacer_11.0-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-11-0-0/svacer-11.0-0.x86_64.rpm svacer-11.0-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 11-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 11-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Help:Installation#Обновление|Upgrade notes]]&amp;lt;br /&amp;gt;[[Svacer#Документация|Documentation 11.x.x]]&lt;br /&gt;
|4.0.250415&lt;br /&gt;
|-&lt;br /&gt;
| 10.0.1&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-1/svacer-10-0-1-linux.tar.gz svacer-10-0-1-linux.tar.gz]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-1/svacer-10-0-1-windows.zip svacer-10-0-1-windows.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-1/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-1/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-1/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-1/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-1/svacer_10.0-1_amd64.deb svacer_10.0-1_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-1/svacer-10.0-1.x86_64.rpm svacer-10.0-1.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 10-0-1|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#Обновление|Upgrade notes]]&amp;lt;br /&amp;gt;[[Documentation 10.x.x]]&lt;br /&gt;
|4.0.241102&lt;br /&gt;
|-&lt;br /&gt;
| 10.0.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-0/svacer-10-0-0-linux.tar.gz svacer-10-0-0-linux.tar.gz]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-0/svacer-10-0-0-windows.zip svacer-10-0-0-windows.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-10-0-0/svacer_10.0-0_amd64.deb svacer_10.0-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-10-0-0/svacer-10.0-0.x86_64.rpm svacer-10.0-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 10-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 10-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Help:Installation#Обновление|Upgrade notes]]&amp;lt;br /&amp;gt;[[Documentation 10.x.x]]&lt;br /&gt;
|4.0.241102&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.2&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-9-0-2.zip svacer-9-0-2.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer_9.0-2_amd64.deb svacer_9.0-2_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-9.0-2.x86_64.rpm svacer-9.0-2.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-2|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&amp;lt;br /&amp;gt;[[Documentation 9.x.x]]&lt;br /&gt;
|3.4.240312&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.1&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-9-0-1.zip svacer-9-0-1.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer_9.0-1_amd64.deb svacer_9.0-1_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-9.0-1.x86_64.rpm svacer-9.0-1.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-1|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&amp;lt;br /&amp;gt;[[Documentation 9.x.x]]&lt;br /&gt;
|3.4.240312&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-9-0-0.zip svacer-9-0-0.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer_9.0-0_amd64.deb svacer_9.0-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-9.0-0.x86_64.rpm svacer-9.0-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 9-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&amp;lt;br /&amp;gt;[[Documentation 9.x.x]]&lt;br /&gt;
|3.4.240312&lt;br /&gt;
|-&lt;br /&gt;
| 8.0.1 &lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8-0-1.zip svacer-8-0-1.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer svacer]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer.exe svacer.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer_8.0-1_amd64.deb svacer_8.0-1_amd64.deb]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8.0-1.x86_64.rpm svacer-8.0-1.x86_64.rpm]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8.0.1.msi svacer-8.0.1.msi]&lt;br /&gt;
| [[Changelog#Release 8-0-1|Changelog]]&amp;lt;br /&amp;gt;[[Documentation 8.x.x]]&lt;br /&gt;
|3.4.0&lt;br /&gt;
|-&lt;br /&gt;
| 8.0.0 &lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8-0-0.zip svacer-8-0-0.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer svacer]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer.exe svacer.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer_8.0-0_amd64.deb svacer_8.0-0_amd64.deb]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8.0-0.x86_64.rpm svacer-8.0-0.x86_64.rpm]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8.0.0.msi svacer-8.0.0.msi]&lt;br /&gt;
| [[Changelog#Release 8-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 8-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Documentation 8.x.x]]&lt;br /&gt;
|3.4.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[https://svacer.ispras.ru/releases Предыдущие релизы] | [https://nextcloud.ispras.ru/index.php/s/x4r4cMJAMr5RZtd?path=%2F Еще более старые релизы]&lt;br /&gt;
&lt;br /&gt;
=== FAQ ===&lt;br /&gt;
* [https://gitlab.ispras.ru/svace/svace-support/-/wikis/home Документация на статический анализатор Svace]&lt;br /&gt;
* [[Help:Introduction#Системные требования|Системные требования]]&lt;br /&gt;
* [[Примеры использования хуков#Создание кейсов в системах отслеживания ошибок|Создание из Svacer кейсов в Gitlab, Jira, Redmine]]&lt;br /&gt;
* Public REST API &lt;br /&gt;
:* [[Help:Public API#Примеры использования public REST API|Примеры использования]]&lt;br /&gt;
:* [https://gitlab.ispras.ru/svacer-public Репозитории с примерами на Python и Go]  &lt;br /&gt;
:* [https://svacer-demo.ispras.ru/api/public/swagger/ Спецификация OpenAPI]&lt;br /&gt;
* [https://t.me/+6pvgZ0oveNVhOTc6 Группа технической поддержки в Telegram]&lt;br /&gt;
&lt;br /&gt;
=== Демо ===&lt;br /&gt;
https://svacer-demo.ispras.ru&lt;br /&gt;
&lt;br /&gt;
* admin / admin — логин / пароль администратора&lt;br /&gt;
* user / user — логин / пароль пользователя&lt;br /&gt;
&lt;br /&gt;
https://svacer-ai-demo.ispras.ru/ — [[Help:XSvacer:AIAssistant|ИИ-ассистент]]&lt;br /&gt;
* admin / admin&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3164</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3164"/>
		<updated>2025-10-28T13:15:46Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Автоочистка снимков/веток/проектов */ добавил опции cleanup-type и убрал Max-snapshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login chernykov_sv&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&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;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3163</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3163"/>
		<updated>2025-10-28T13:13:43Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup-type add&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит раз в 24 часа (данное время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;), первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. После этого происходит удаление пустых веток и проектов в соответствии с правилами удаления. Также информация о удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --max-snapshots &amp;lt;max&amp;gt; --type &amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней). '''Игнорируется, если &amp;lt;code&amp;gt;--max-snapshots &amp;gt; 0&amp;lt;/code&amp;gt;'''&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
* &amp;lt;code&amp;gt;--cleanup-type&amp;lt;/code&amp;gt; — тип очистки. Возможные значения - project, branch, snapshot (по умолчанию snapshot). При указании snapshot будут очищаться снимки в соответствии с паттерном проект+ветка+снимок и проверяться &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;. При указании branch будут удаляться пустые ветки в соответствии с паттерном project + branch. При указании project Будут удаляться пустые проекты (у которых нет веток) в соответствии с паттерном project. При указании branch или project невозможно указать &amp;lt;code&amp;gt;keep-time&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;min-snapshots&amp;lt;/code&amp;gt;, эти флаги не учитываются.&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
'''Очистка пустых веток'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;master&amp;quot;  --cleanup-type branch&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
[[File:Cleanup rules.png|none|thumb|955x955px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Cleanup_rules.png&amp;diff=3162</id>
		<title>File:Cleanup rules.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Cleanup_rules.png&amp;diff=3162"/>
		<updated>2025-10-28T13:12:10Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;cleanup rules&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3161</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=3161"/>
		<updated>2025-10-27T11:40:36Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: more describe about edit-markers&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&lt;br /&gt;
Все операции происходят на стороне клиента до загрузки данных на сервер. При импорте результатов Svace, а также sarif (без указания флага --upload) изменяется .svacer-dir. Директория .svace-dir остается неизменной. Снимок остается неизменным при импорте.&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;
    &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;
==== skip — Пропуск маркеров ====&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;
==== change — Изменение маркеров ====&lt;br /&gt;
Изменяет указанные поля маркеров.&lt;br /&gt;
  {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Объединяет маркеры с одинаковыми значениями указанных полей.&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;
Поля для группировки (можно указать от 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;
&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;icontains(file, 'test') or icontains(file, 'spec')&amp;quot;&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE' and icontains(file, 'generated')&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;INFO&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;
&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&amp;quot;&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 == '.build/src/generated.c'&amp;quot;&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,function&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 ['DEBUG', 'TRACE', 'INFO'] 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;LOW_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;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;regex(file, \&amp;quot;.*_test\\\\.(c|cpp)$\&amp;quot;)&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass in ['UNREACHABLE_CODE.ENUM', 'UNREACHABLE_CODE.RET', 'UNUSED_VALUE.PARAM_ASSIGN']&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;contains(file, 'generated') or contains(file, '.build') 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;
Фильтрация по сложным паттернам путей:&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;regex(file, \&amp;quot;^(tests?|spec|mock|stub)/.*$\&amp;quot;) or nregex(file, \&amp;quot;^src/.*\\.(c|cpp|h|hpp)$\&amp;quot;)&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;
  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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3160</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=3160"/>
		<updated>2025-10-24T18:23:06Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: edit-markers remove upload and line change&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&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;
    &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;
==== skip — Пропуск маркеров ====&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;
==== change — Изменение маркеров ====&lt;br /&gt;
Изменяет указанные поля маркеров.&lt;br /&gt;
  {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Объединяет маркеры с одинаковыми значениями указанных полей.&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;
Поля для группировки (можно указать от 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;
&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;icontains(file, 'test') or icontains(file, 'spec')&amp;quot;&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE' and icontains(file, 'generated')&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;INFO&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;
&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&amp;quot;&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 == '.build/src/generated.c'&amp;quot;&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,function&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 ['DEBUG', 'TRACE', 'INFO'] 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;LOW_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;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;regex(file, \&amp;quot;.*_test\\\\.(c|cpp)$\&amp;quot;)&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass in ['UNREACHABLE_CODE.ENUM', 'UNREACHABLE_CODE.RET', 'UNUSED_VALUE.PARAM_ASSIGN']&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;contains(file, 'generated') or contains(file, '.build') 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;
Фильтрация по сложным паттернам путей:&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;regex(file, \&amp;quot;^(tests?|spec|mock|stub)/.*$\&amp;quot;) or nregex(file, \&amp;quot;^src/.*\\.(c|cpp|h|hpp)$\&amp;quot;)&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;
  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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3159</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3159"/>
		<updated>2025-10-24T18:14:30Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup remove max mode and change min mode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит раз в 24 часа (данное время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;), первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление самых старых по времени создания подходящих снимков и заносится отметка в таблицу удаленных снимков и в системный журнал. Также информация о удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt; --max-snapshots &amp;lt;max&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; — проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех проектов)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; — ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt; — время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней). '''Игнорируется, если &amp;lt;code&amp;gt;--max-snapshots &amp;gt; 0&amp;lt;/code&amp;gt;'''&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; — количество снимков, которое необходимо оставлять в ветке, подходящей под паттерн project + branch. По умолчанию 0&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;         # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;        # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;    # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; — ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; — снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
'''Правило 1: Удаление по времени'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Правило 2: Ограничение количества'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет не более 20 снимков, остальные будут удаляться.&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются правилами cleanup'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
&lt;br /&gt;
[[File:Cleanup rules table.png|center|thumb|1006x1006px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[^x]&amp;lt;/code&amp;gt; || Отрицание символов || &amp;lt;code&amp;gt;^[^m].*$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3152</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3152"/>
		<updated>2025-10-17T09:37:08Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: add info cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит раз в 24 часа (данное время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;), первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление и заносится отметка в таблицу удаленных снимков. Также информация о удалении через cleanup вносится в системный журнал.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;time&amp;gt;--max-snapshots &amp;lt;max&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; - проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; - ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt;  - время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней). '''Игнорируется, если &amp;lt;code&amp;gt;--max-snapshots &amp;gt; 0&amp;lt;/code&amp;gt;'''&lt;br /&gt;
* &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; - верхняя граница по количеству снимков в ветке. При значении = 0 данное правило не работает. При значении &amp;gt; 0 '''игнорирует'''  '''&amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt;'''. По умолчанию 0&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MAX устанавливает верхнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
* Считает '''все''' снимки в ветке (total) если хотя бы один из снимков подходит под &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* Если &amp;lt;code&amp;gt;total &amp;gt; MAX&amp;lt;/code&amp;gt;, удаляет &amp;lt;code&amp;gt;(total - MAX)&amp;lt;/code&amp;gt; самых старых снимков&lt;br /&gt;
* Удаляет '''только''' снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* При &amp;lt;code&amp;gt;MAX = 0&amp;lt;/code&amp;gt; данное правило не работает&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: Только TIME&lt;br /&gt;
 10 снимков в ветке, 5 старше 24h&lt;br /&gt;
 Правило: --keep-time 24h --max-snapshots 0&lt;br /&gt;
 Результат: Удалит 5 старых снимков (&amp;gt;24h), останется 5&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: Только MAX&lt;br /&gt;
 10 снимков в ветке&lt;br /&gt;
 Правило: --max-snapshots 5&lt;br /&gt;
 Результат: Удалит 5 самых старых, оставит 5 новейших&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MAX игнорирует TIME&lt;br /&gt;
 10 снимков, 5 старше 24h, 5 новых &amp;lt;24h&lt;br /&gt;
 Правило: --keep-time 24h --max-snapshots 8&lt;br /&gt;
 Результат: &lt;br /&gt;
   TIME игнорируется. Применяется ТОЛЬКО MAX&lt;br /&gt;
   Удалит 2 самых старых и останется 8 (MAX)&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Scoped правило с MAX&lt;br /&gt;
 10 снимков: 6 nightly-*, 4 regular-*&lt;br /&gt;
 Правило: --snapshot &amp;quot;nightly-*&amp;quot; --max-snapshots 8&lt;br /&gt;
 Результат:&lt;br /&gt;
   total = 10 &amp;gt; MAX=8, нужно удалить 2&lt;br /&gt;
   Удалит 2 самых старых ТОЛЬКО из nightly-*&lt;br /&gt;
   Останется: 4 nightly-* + 4 regular-* = 8 снимков&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;      # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;     # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;   # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; - ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; - нижняя граница по количеству снимков в ветке. По умолчанию '''0''' &lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MIN устанавливает нижнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
&lt;br /&gt;
'''Значение = 0''' — '''полный запрет на удаление:'''&lt;br /&gt;
* Снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;, '''никогда не удаляются'''&lt;br /&gt;
* Применяется индивидуально к каждому снимку&lt;br /&gt;
&lt;br /&gt;
'''Значение &amp;gt; 0''' — '''минимальное количество в ветке:'''&lt;br /&gt;
* Правило применяется ко '''всей ветке''', если хотя бы один снимок подходит под паттерн&lt;br /&gt;
* Пока &amp;lt;code&amp;gt;total_snapshots ≤ MIN&amp;lt;/code&amp;gt;, в ветке '''ничего не удаляется'''&lt;br /&gt;
* После того как &amp;lt;code&amp;gt;total &amp;gt; MIN&amp;lt;/code&amp;gt;, можно удалить до &amp;lt;code&amp;gt;(total - MIN)&amp;lt;/code&amp;gt; снимков&lt;br /&gt;
&lt;br /&gt;
'''Важные моменты:'''&lt;br /&gt;
* При множественных запретах для одной ветки берется '''МАКСИМАЛЬНОЕ''' значение MIN&lt;br /&gt;
* MIN '''всегда''' имеет приоритет над MAX&lt;br /&gt;
* Если MIN=5 и MAX=3, то в ветке останется 5 снимков (MIN побеждает)&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: MIN&lt;br /&gt;
 Правило: --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков&lt;br /&gt;
 Результат: Можно удалить до 5 снимков (10 - 5 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: MIN с паттерном&lt;br /&gt;
 Правило: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Ветка имеет 8 снимков (включая 2 release-*)&lt;br /&gt;
 Результат: &lt;br /&gt;
   - Хотя бы 1 release-* есть → MIN=3 применяется ко ВСЕЙ ветке&lt;br /&gt;
   - Можно удалить до 5 снимков (8 - 3 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MIN=0&lt;br /&gt;
 Правило: --snapshot &amp;quot;important-*&amp;quot; --min-snapshots 0&lt;br /&gt;
 Ветка имеет 10 снимков (2 important-*, 8 других)&lt;br /&gt;
 Результат:&lt;br /&gt;
   - important-* НИКОГДА не удаляются&lt;br /&gt;
   - Остальные 8 могут быть удалены&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Множественные MIN&lt;br /&gt;
 Правило 1: --snapshot &amp;quot;*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Правило 2: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков (включая release-*)&lt;br /&gt;
 Результат: MIN = 5 (максимальное), можно удалить до 5 снимков&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
'''Правило 1: Удаление по времени'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot; --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Правило 2: Ограничение количества (MAX mode)'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет максимум 20 снимков (независимо от возраста).&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
&lt;br /&gt;
[[File:Cleanup rules table.png|center|thumb|1006x1006px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Защита важных снимков ===&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;*&amp;quot; --snapshot &amp;quot;*release*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки &amp;lt;code&amp;gt;*release*&amp;lt;/code&amp;gt; никогда не удаляются.&lt;br /&gt;
&lt;br /&gt;
=== Ограничение количества снимков ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В ветке main хранить максимум 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Комбинация MIN и MAX ===&lt;br /&gt;
&lt;br /&gt;
 '''Минимум 5 снимков'''&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 5&lt;br /&gt;
 &lt;br /&gt;
 '''Максимум 20 снимков'''&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
Результат: в ветке main всегда будет от 5 до 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[^x]&lt;br /&gt;
|Отрицание символов&lt;br /&gt;
|^[^m].*$&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3151</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3151"/>
		<updated>2025-10-15T14:07:42Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Автоочистка снимков/веток/проектов */ добавил ссылку на клинап&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Разметка маркеров с помощью AI =&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается путем активации параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
= Изменения в пользовательских фильтрах =&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1.  Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2.   Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т.п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
= Изменения в разделе '''Поиск''' =&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1.   Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.   Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
= Изменения на вкладке с исходным кодом файла =&lt;br /&gt;
1.  Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2.  Добавлена функция добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
= Сравнение маркеров при их сопоставлении =&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает пользователю определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
= Просмотр JSON маркера =&lt;br /&gt;
В дополнении к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
= Изменения в разделе '''Проекты''' =&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
= Редактирование маркеров при импорте =&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
= Добавлена форма управления асинхронными задачами =&lt;br /&gt;
В разделе '''Настройки -&amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех юзеров. Пользователю без данного доступа доступно управление только своими асинхронные задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': в следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
= Изменения в разделе '''Информация о сервере''' =&lt;br /&gt;
В разделе '''Настройки -&amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т.к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере - вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере - вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере - вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
= Лицензирование Svacer =&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии доступна пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии до 31.12.2027.&lt;br /&gt;
&lt;br /&gt;
= Парольная политика =&lt;br /&gt;
Реализована возможность в конфигурационном файле задать парольную политику:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&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;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
В поле min_length - минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спец символов - !#.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&amp;gt;security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&amp;lt;/code&amp;gt;&lt;br /&gt;
Т.е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 &amp;lt;code&amp;gt;svacer user-proiver unlock -login chernykov_sv&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Открытие вкладки LDAP по умолчанию =&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет отрываться вкладка Svacer, если false - то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&amp;gt;auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Автоочистка снимков/веток/проектов =&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* ??? - удалять пустые ветки;&lt;br /&gt;
* ??? - удалять пустые проекты;&lt;br /&gt;
* max-snapshots - верхняя граница по количеству снимков в ветке;&lt;br /&gt;
* min-snapshots - нижняя граница по количеству снимков в ветке.&lt;br /&gt;
Подробное описание функции и ее опций [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
= Веб-хуки для нотификаций =&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&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;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&amp;gt;webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&amp;lt;/code&amp;gt;&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;svacer server webhook journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;svacer server webhook stat&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3150</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3150"/>
		<updated>2025-10-15T14:06:26Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: /* Редактирование маркеров при импорте */ добавил ссылку на документацию по edit-markers в release notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Разметка маркеров с помощью AI =&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается путем активации параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
= Изменения в пользовательских фильтрах =&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1.  Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2.   Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т.п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
= Изменения в разделе '''Поиск''' =&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1.   Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.   Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
= Изменения на вкладке с исходным кодом файла =&lt;br /&gt;
1.  Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2.  Добавлена функция добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
= Сравнение маркеров при их сопоставлении =&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает пользователю определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
= Просмотр JSON маркера =&lt;br /&gt;
В дополнении к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
= Изменения в разделе '''Проекты''' =&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
= Редактирование маркеров при импорте =&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
= Добавлена форма управления асинхронными задачами =&lt;br /&gt;
В разделе '''Настройки -&amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех юзеров. Пользователю без данного доступа доступно управление только своими асинхронные задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': в следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
= Изменения в разделе '''Информация о сервере''' =&lt;br /&gt;
В разделе '''Настройки -&amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т.к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере - вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере - вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере - вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
= Лицензирование Svacer =&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии доступна пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии до 31.12.2027.&lt;br /&gt;
&lt;br /&gt;
= Парольная политика =&lt;br /&gt;
Реализована возможность в конфигурационном файле задать парольную политику:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&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;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
В поле min_length - минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спец символов - !#.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&amp;gt;security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&amp;lt;/code&amp;gt;&lt;br /&gt;
Т.е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 &amp;lt;code&amp;gt;svacer user-proiver unlock -login chernykov_sv&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Открытие вкладки LDAP по умолчанию =&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет отрываться вкладка Svacer, если false - то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&amp;gt;auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Автоочистка снимков/веток/проектов =&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* ??? - удалять пустые ветки;&lt;br /&gt;
* ??? - удалять пустые проекты;&lt;br /&gt;
* max-snapshots - верхняя граница по количеству снимков в ветке;&lt;br /&gt;
* min-snapshots - нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
= Веб-хуки для нотификаций =&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&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;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 &amp;lt;code&amp;gt;webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&amp;lt;/code&amp;gt;&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;svacer server webhook journal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;svacer server webhook stat&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Edit_markers_(command_line)&amp;diff=3149</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=3149"/>
		<updated>2025-10-15T14:03:02Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: edit-markers page&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''' — объединение дублирующихся маркеров. У маркеров, подходящих под правило, объединяется трасса и остается только один (случайный) маркер с объединенной трассой, остальные маркеры удаляются.&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 upload --edit-markers &amp;lt;файл_правил.json&amp;gt; [другие опции]&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;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;
    &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;
==== skip — Пропуск маркеров ====&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;
==== change — Изменение маркеров ====&lt;br /&gt;
Изменяет указанные поля маркеров.&lt;br /&gt;
  {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;change&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE'&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;quot;change&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;warnclass&amp;quot;: &amp;quot;IGNORED&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;msg&amp;quot;: &amp;quot;Код помечен как недостижимый&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;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;
Объединяет маркеры с одинаковыми значениями указанных полей.&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;
Поля для группировки (можно указать от 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;
&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;icontains(file, 'test') or icontains(file, 'spec')&amp;quot;&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass == 'UNREACHABLE_CODE' and icontains(file, 'generated')&amp;quot;,&lt;br /&gt;
    &amp;quot;change&amp;quot;: {&lt;br /&gt;
      &amp;quot;warnclass&amp;quot;: &amp;quot;INFO&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;
&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&amp;quot;&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 == '.build/src/generated.c'&amp;quot;&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,function&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 ['DEBUG', 'TRACE', 'INFO'] 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;LOW_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;
    &amp;quot;action&amp;quot;: &amp;quot;skip&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;regex(file, \&amp;quot;.*_test\\\\.(c|cpp)$\&amp;quot;)&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;change&amp;quot;,&lt;br /&gt;
    &amp;quot;rules&amp;quot;: &amp;quot;warnclass in ['UNREACHABLE_CODE.ENUM', 'UNREACHABLE_CODE.RET', 'UNUSED_VALUE.PARAM_ASSIGN']&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;contains(file, 'generated') or contains(file, '.build') 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;
Фильтрация по сложным паттернам путей:&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;regex(file, \&amp;quot;^(tests?|spec|mock|stub)/.*$\&amp;quot;) or nregex(file, \&amp;quot;^src/.*\\.(c|cpp|h|hpp)$\&amp;quot;)&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;
  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>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3148</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3148"/>
		<updated>2025-10-14T12:45:23Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: remove bug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит раз в 24 часа (данное время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;), первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление и заносится отметка в таблицу удаленных снимков.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;time&amp;gt;--max-snapshots &amp;lt;max&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; - проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; - ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt;  - время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней). '''Игнорируется, если &amp;lt;code&amp;gt;--max-snapshots &amp;gt; 0&amp;lt;/code&amp;gt;'''&lt;br /&gt;
* &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; - верхняя граница по количеству снимков в ветке. При значении = 0 данное правило не работает. При значении &amp;gt; 0 '''игнорирует'''  '''&amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt;'''. По умолчанию 0&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MAX устанавливает верхнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
* Считает '''все''' снимки в ветке (total) если хотя бы один из снимков подходит под &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* Если &amp;lt;code&amp;gt;total &amp;gt; MAX&amp;lt;/code&amp;gt;, удаляет &amp;lt;code&amp;gt;(total - MAX)&amp;lt;/code&amp;gt; самых старых снимков&lt;br /&gt;
* Удаляет '''только''' снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* При &amp;lt;code&amp;gt;MAX = 0&amp;lt;/code&amp;gt; данное правило не работает&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: Только TIME&lt;br /&gt;
 10 снимков в ветке, 5 старше 24h&lt;br /&gt;
 Правило: --keep-time 24h --max-snapshots 0&lt;br /&gt;
 Результат: Удалит 5 старых снимков (&amp;gt;24h), останется 5&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: Только MAX&lt;br /&gt;
 10 снимков в ветке&lt;br /&gt;
 Правило: --max-snapshots 5&lt;br /&gt;
 Результат: Удалит 5 самых старых, оставит 5 новейших&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MAX игнорирует TIME&lt;br /&gt;
 10 снимков, 5 старше 24h, 5 новых &amp;lt;24h&lt;br /&gt;
 Правило: --keep-time 24h --max-snapshots 8&lt;br /&gt;
 Результат: &lt;br /&gt;
   TIME игнорируется. Применяется ТОЛЬКО MAX&lt;br /&gt;
   Удалит 2 самых старых и останется 8 (MAX)&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Scoped правило с MAX&lt;br /&gt;
 10 снимков: 6 nightly-*, 4 regular-*&lt;br /&gt;
 Правило: --snapshot &amp;quot;nightly-*&amp;quot; --max-snapshots 8&lt;br /&gt;
 Результат:&lt;br /&gt;
   total = 10 &amp;gt; MAX=8, нужно удалить 2&lt;br /&gt;
   Удалит 2 самых старых ТОЛЬКО из nightly-*&lt;br /&gt;
   Останется: 4 nightly-* + 4 regular-* = 8 снимков&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;      # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;     # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;   # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; - ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; - нижняя граница по количеству снимков в ветке. По умолчанию '''0''' &lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MIN устанавливает нижнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
&lt;br /&gt;
'''Значение = 0''' — '''полный запрет на удаление:'''&lt;br /&gt;
* Снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;, '''никогда не удаляются'''&lt;br /&gt;
* Применяется индивидуально к каждому снимку&lt;br /&gt;
&lt;br /&gt;
'''Значение &amp;gt; 0''' — '''минимальное количество в ветке:'''&lt;br /&gt;
* Правило применяется ко '''всей ветке''', если хотя бы один снимок подходит под паттерн&lt;br /&gt;
* Пока &amp;lt;code&amp;gt;total_snapshots ≤ MIN&amp;lt;/code&amp;gt;, в ветке '''ничего не удаляется'''&lt;br /&gt;
* После того как &amp;lt;code&amp;gt;total &amp;gt; MIN&amp;lt;/code&amp;gt;, можно удалить до &amp;lt;code&amp;gt;(total - MIN)&amp;lt;/code&amp;gt; снимков&lt;br /&gt;
&lt;br /&gt;
'''Важные моменты:'''&lt;br /&gt;
* При множественных запретах для одной ветки берется '''МАКСИМАЛЬНОЕ''' значение MIN&lt;br /&gt;
* MIN '''всегда''' имеет приоритет над MAX&lt;br /&gt;
* Если MIN=5 и MAX=3, то в ветке останется 5 снимков (MIN побеждает)&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: MIN&lt;br /&gt;
 Правило: --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков&lt;br /&gt;
 Результат: Можно удалить до 5 снимков (10 - 5 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: MIN с паттерном&lt;br /&gt;
 Правило: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Ветка имеет 8 снимков (включая 2 release-*)&lt;br /&gt;
 Результат: &lt;br /&gt;
   - Хотя бы 1 release-* есть → MIN=3 применяется ко ВСЕЙ ветке&lt;br /&gt;
   - Можно удалить до 5 снимков (8 - 3 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MIN=0&lt;br /&gt;
 Правило: --snapshot &amp;quot;important-*&amp;quot; --min-snapshots 0&lt;br /&gt;
 Ветка имеет 10 снимков (2 important-*, 8 других)&lt;br /&gt;
 Результат:&lt;br /&gt;
   - important-* НИКОГДА не удаляются&lt;br /&gt;
   - Остальные 8 могут быть удалены&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Множественные MIN&lt;br /&gt;
 Правило 1: --snapshot &amp;quot;*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Правило 2: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков (включая release-*)&lt;br /&gt;
 Результат: MIN = 5 (максимальное), можно удалить до 5 снимков&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
'''Правило 1: Удаление по времени'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot; --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Правило 2: Ограничение количества (MAX mode)'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет максимум 20 снимков (независимо от возраста).&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
&lt;br /&gt;
[[File:Cleanup rules table.png|center|thumb|1006x1006px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Защита важных снимков ===&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;*&amp;quot; --snapshot &amp;quot;*release*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки &amp;lt;code&amp;gt;*release*&amp;lt;/code&amp;gt; никогда не удаляются.&lt;br /&gt;
&lt;br /&gt;
=== Ограничение количества снимков ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В ветке main хранить максимум 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Комбинация MIN и MAX ===&lt;br /&gt;
&lt;br /&gt;
 '''Минимум 5 снимков'''&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 5&lt;br /&gt;
 &lt;br /&gt;
 '''Максимум 20 снимков'''&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
Результат: в ветке main всегда будет от 5 до 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[^x]&lt;br /&gt;
|Отрицание символов&lt;br /&gt;
|^[^m].*$&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3124</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3124"/>
		<updated>2025-10-13T17:26:22Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: add more info about cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит раз в 24 часа (данное время можно задать при запуске сервера опцией &amp;lt;code&amp;gt;--snapshots-cleanup-period&amp;lt;/code&amp;gt;, либо в конфигурационном файле, либо переменной окружения &amp;lt;code&amp;gt;SVACER_CLEANUP_SNAPSHOTS_PERIOD&amp;lt;/code&amp;gt;), первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление и заносится отметка в таблицу удаленных снимков.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --keep-time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;time&amp;gt;--max-snapshots &amp;lt;max&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; - проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; - ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--keep-time&amp;lt;/code&amp;gt;  - время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней). '''Игнорируется, если &amp;lt;code&amp;gt;--max-snapshots &amp;gt; 0&amp;lt;/code&amp;gt;'''&lt;br /&gt;
* &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; - верхняя граница по количеству снимков в ветке. При значении = 0 данное правило не работает. При значении &amp;gt; 0 '''игнорирует'''  '''&amp;lt;code&amp;gt;--time&amp;lt;/code&amp;gt;'''. По умолчанию 0&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MAX устанавливает верхнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
* Считает '''все''' снимки в ветке (total) если хотя бы один из снимков подходит под &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* Если &amp;lt;code&amp;gt;total &amp;gt; MAX&amp;lt;/code&amp;gt;, удаляет &amp;lt;code&amp;gt;(total - MAX)&amp;lt;/code&amp;gt; самых старых снимков&lt;br /&gt;
* Удаляет '''только''' снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* При &amp;lt;code&amp;gt;MAX = 0&amp;lt;/code&amp;gt; данное правило не работает&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: Только TIME&lt;br /&gt;
 10 снимков в ветке, 5 старше 24h&lt;br /&gt;
 Правило: --keep-time 24h --max-snapshots 0&lt;br /&gt;
 Результат: Удалит 5 старых снимков (&amp;gt;24h), останется 5&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: Только MAX&lt;br /&gt;
 10 снимков в ветке&lt;br /&gt;
 Правило: --max-snapshots 5&lt;br /&gt;
 Результат: Удалит 5 самых старых, оставит 5 новейших&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MAX игнорирует TIME&lt;br /&gt;
 10 снимков, 5 старше 24h, 5 новых &amp;lt;24h&lt;br /&gt;
 Правило: --keep-time 24h --max-snapshots 8&lt;br /&gt;
 Результат: &lt;br /&gt;
   TIME игнорируется. Применяется ТОЛЬКО MAX&lt;br /&gt;
   Удалит 2 самых старых и останется 8 (MAX)&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Scoped правило с MAX&lt;br /&gt;
 10 снимков: 6 nightly-*, 4 regular-*&lt;br /&gt;
 Правило: --snapshot &amp;quot;nightly-*&amp;quot; --max-snapshots 8&lt;br /&gt;
 Результат:&lt;br /&gt;
   total = 10 &amp;gt; MAX=8, нужно удалить 2&lt;br /&gt;
   Удалит 2 самых старых ТОЛЬКО из nightly-*&lt;br /&gt;
   Останется: 4 nightly-* + 4 regular-* = 8 снимков&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;      # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;     # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;   # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; - ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; - нижняя граница по количеству снимков в ветке. По умолчанию '''0''' &lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MIN устанавливает нижнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
&lt;br /&gt;
'''Значение = 0''' — '''полный запрет на удаление:'''&lt;br /&gt;
* Снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;, '''никогда не удаляются'''&lt;br /&gt;
* Применяется индивидуально к каждому снимку&lt;br /&gt;
&lt;br /&gt;
'''Значение &amp;gt; 0''' — '''минимальное количество в ветке:'''&lt;br /&gt;
* Правило применяется ко '''всей ветке''', если хотя бы один снимок подходит под паттерн&lt;br /&gt;
* Пока &amp;lt;code&amp;gt;total_snapshots ≤ MIN&amp;lt;/code&amp;gt;, в ветке '''ничего не удаляется'''&lt;br /&gt;
* После того как &amp;lt;code&amp;gt;total &amp;gt; MIN&amp;lt;/code&amp;gt;, можно удалить до &amp;lt;code&amp;gt;(total - MIN)&amp;lt;/code&amp;gt; снимков&lt;br /&gt;
&lt;br /&gt;
'''Важные моменты:'''&lt;br /&gt;
* При множественных запретах для одной ветки берется '''МАКСИМАЛЬНОЕ''' значение MIN&lt;br /&gt;
* MIN '''всегда''' имеет приоритет над MAX&lt;br /&gt;
* Если MIN=5 и MAX=3, то в ветке останется 5 снимков (MIN побеждает)&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: MIN&lt;br /&gt;
 Правило: --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков&lt;br /&gt;
 Результат: Можно удалить до 5 снимков (10 - 5 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: MIN с паттерном&lt;br /&gt;
 Правило: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Ветка имеет 8 снимков (включая 2 release-*)&lt;br /&gt;
 Результат: &lt;br /&gt;
   - Хотя бы 1 release-* есть → MIN=3 применяется ко ВСЕЙ ветке&lt;br /&gt;
   - Можно удалить до 5 снимков (8 - 3 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MIN=0&lt;br /&gt;
 Правило: --snapshot &amp;quot;important-*&amp;quot; --min-snapshots 0&lt;br /&gt;
 Ветка имеет 10 снимков (2 important-*, 8 других)&lt;br /&gt;
 Результат:&lt;br /&gt;
   - important-* НИКОГДА не удаляются&lt;br /&gt;
   - Остальные 8 могут быть удалены&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Множественные MIN&lt;br /&gt;
 Правило 1: --snapshot &amp;quot;*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Правило 2: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков (включая release-*)&lt;br /&gt;
 Результат: MIN = 5 (максимальное), можно удалить до 5 снимков&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
'''Правило 1: Удаление по времени'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time &amp;quot;240h&amp;quot; --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Правило 2: Ограничение количества (MAX mode)'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет максимум 20 снимков (независимо от возраста).&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
&lt;br /&gt;
[[File:Cleanup rules table.png|center|thumb|1006x1006px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Защита важных снимков ===&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;*&amp;quot; --snapshot &amp;quot;*release*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки &amp;lt;code&amp;gt;*release*&amp;lt;/code&amp;gt; никогда не удаляются.&lt;br /&gt;
&lt;br /&gt;
=== Ограничение количества снимков ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В ветке main хранить максимум 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Комбинация MIN и MAX ===&lt;br /&gt;
&lt;br /&gt;
 '''Минимум 5 снимков'''&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 5&lt;br /&gt;
 &lt;br /&gt;
 '''Максимум 20 снимков'''&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
Результат: в ветке main всегда будет от 5 до 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --keep-time 168h --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[^x]&lt;br /&gt;
|Отрицание символов&lt;br /&gt;
|^[^m].*$&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3123</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3123"/>
		<updated>2025-10-13T16:25:41Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup info add more info and examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое удаление снимков =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
Удаление происходит раз в час (данное время можно изменить в переменных окружения или при запуске сервера), первое удаление всех подходящих снимков будет через указанное время после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом '''ServerOperations'''.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление и заносится отметка в таблицу удаленных снимков.&lt;br /&gt;
&lt;br /&gt;
== Добавление нового правила удаления ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --time &amp;lt;time&amp;gt; --max-snapshots &amp;lt;max&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt; - проект, в котором искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt; - ветка, в которой искать снимки для удаления ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок, который удалять ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--time&amp;lt;/code&amp;gt;  - время, которое должно пройти после создания '''(НЕ импорта)''' снимка, чтобы его удалить. Задается в формате Go Duration (например &amp;lt;code&amp;gt;33h5m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;720h&amp;lt;/code&amp;gt;). По умолчанию '''720 часов''' (30 дней). '''Игнорируется, если &amp;lt;code&amp;gt;--max-snapshots &amp;gt; 0&amp;lt;/code&amp;gt;'''&lt;br /&gt;
* &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; - верхняя граница по количеству снимков в ветке. При значении = 0 данное правило не работает. При значении &amp;gt; 0 '''игнорирует'''  '''&amp;lt;code&amp;gt;--time&amp;lt;/code&amp;gt;'''. По умолчанию 0&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--max-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MAX устанавливает верхнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
* Считает '''все''' снимки в ветке (total) если хотя бы один из снимков подходит под &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* Если &amp;lt;code&amp;gt;total &amp;gt; MAX&amp;lt;/code&amp;gt;, удаляет &amp;lt;code&amp;gt;(total - MAX)&amp;lt;/code&amp;gt; самых старых снимков&lt;br /&gt;
* Удаляет '''только''' снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;&lt;br /&gt;
* При &amp;lt;code&amp;gt;MAX = 0&amp;lt;/code&amp;gt; данное правило не работает&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: Только TIME&lt;br /&gt;
 10 снимков в ветке, 5 старше 24h&lt;br /&gt;
 Правило: --time 24h --max-snapshots 0&lt;br /&gt;
 Результат: Удалит 5 старых снимков (&amp;gt;24h), останется 5&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: Только MAX&lt;br /&gt;
 10 снимков в ветке&lt;br /&gt;
 Правило: --max-snapshots 5&lt;br /&gt;
 Результат: Удалит 5 самых старых, оставит 5 новейших&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MAX игнорирует TIME&lt;br /&gt;
 10 снимков, 5 старше 24h, 5 новых &amp;lt;24h&lt;br /&gt;
 Правило: --time 24h --max-snapshots 8&lt;br /&gt;
 Результат: &lt;br /&gt;
   TIME игнорируется. Применяется ТОЛЬКО MAX&lt;br /&gt;
   Удалит 2 самых старых и останется 8 (MAX)&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Scoped правило с MAX&lt;br /&gt;
 10 снимков: 6 nightly-*, 4 regular-*&lt;br /&gt;
 Правило: --snapshot &amp;quot;nightly-*&amp;quot; --max-snapshots 8&lt;br /&gt;
 Результат:&lt;br /&gt;
   total = 10 &amp;gt; MAX=8, нужно удалить 2&lt;br /&gt;
   Удалит 2 самых старых ТОЛЬКО из nightly-*&lt;br /&gt;
   Останется: 4 nightly-* + 4 regular-* = 8 снимков&lt;br /&gt;
&lt;br /&gt;
=== Шаблоны и паттерны ===&lt;br /&gt;
&lt;br /&gt;
Флаги &amp;lt;code&amp;gt;--project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; можно задавать как:&lt;br /&gt;
&lt;br /&gt;
'''1. Имя или ID:'''&lt;br /&gt;
 --project &amp;quot;MyProject&amp;quot;&lt;br /&gt;
 --project &amp;quot;550e8400-e29b-41d4-a716-446655440000&amp;quot;  # UUID проекта&lt;br /&gt;
&lt;br /&gt;
'''2. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; (любое количество любых символов):'''&lt;br /&gt;
 --project &amp;quot;Dev*&amp;quot;      # DevProject, Development&lt;br /&gt;
 --branch &amp;quot;*test*&amp;quot;     # test, my-test, testing&lt;br /&gt;
 --snapshot &amp;quot;nightly-*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''3. Регулярные выражения (с префиксом &amp;lt;code&amp;gt;re:&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
 --snapshot &amp;quot;re:^v[0-9]+\.[0-9]+\.[0-9]+$&amp;quot;   # v1.0.0, v2.3.5&lt;br /&gt;
 --branch &amp;quot;re:^feature/[0-9]+$&amp;quot;               # feature/123&lt;br /&gt;
&lt;br /&gt;
== Добавление запрета на удаление ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project&amp;gt; --branch &amp;lt;branch&amp;gt; --snapshot &amp;lt;snapshot&amp;gt; --min-snapshots &amp;lt;min&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Параметры ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--project&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;--branch&amp;lt;/code&amp;gt; - ветка ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех веток)&lt;br /&gt;
* &amp;lt;code&amp;gt;--snapshot&amp;lt;/code&amp;gt; - снимок ('''обязательный''', используйте &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; для всех снимков)&lt;br /&gt;
* &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; - нижняя граница по количеству снимков в ветке. По умолчанию '''0''' &lt;br /&gt;
Флаги проекта, ветки и снимка работают аналогично с флагами в &amp;lt;code&amp;gt;--add-rule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Логика работы &amp;lt;code&amp;gt;--min-snapshots&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''MIN устанавливает нижнюю границу по количеству снимков в ветке:'''&lt;br /&gt;
&lt;br /&gt;
'''Значение = 0''' — '''полный запрет на удаление:'''&lt;br /&gt;
* Снимки, подходящие под паттерн &amp;lt;code&amp;gt;project\branch\snapshot&amp;lt;/code&amp;gt;, '''никогда не удаляются'''&lt;br /&gt;
* Применяется индивидуально к каждому снимку&lt;br /&gt;
&lt;br /&gt;
'''Значение &amp;gt; 0''' — '''минимальное количество в ветке:'''&lt;br /&gt;
* Правило применяется ко '''всей ветке''', если хотя бы один снимок подходит под паттерн&lt;br /&gt;
* Пока &amp;lt;code&amp;gt;total_snapshots ≤ MIN&amp;lt;/code&amp;gt;, в ветке '''ничего не удаляется'''&lt;br /&gt;
* После того как &amp;lt;code&amp;gt;total &amp;gt; MIN&amp;lt;/code&amp;gt;, можно удалить до &amp;lt;code&amp;gt;(total - MIN)&amp;lt;/code&amp;gt; снимков&lt;br /&gt;
&lt;br /&gt;
'''Важные моменты:'''&lt;br /&gt;
* При множественных запретах для одной ветки берется '''МАКСИМАЛЬНОЕ''' значение MIN&lt;br /&gt;
* MIN '''всегда''' имеет приоритет над MAX&lt;br /&gt;
* Если MIN=5 и MAX=3, то в ветке останется 5 снимков (MIN побеждает)&lt;br /&gt;
&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
&lt;br /&gt;
 Пример 1: MIN&lt;br /&gt;
 Правило: --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков&lt;br /&gt;
 Результат: Можно удалить до 5 снимков (10 - 5 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 2: MIN с паттерном&lt;br /&gt;
 Правило: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Ветка имеет 8 снимков (включая 2 release-*)&lt;br /&gt;
 Результат: &lt;br /&gt;
   - Хотя бы 1 release-* есть → MIN=3 применяется ко ВСЕЙ ветке&lt;br /&gt;
   - Можно удалить до 5 снимков (8 - 3 = 5)&lt;br /&gt;
 &lt;br /&gt;
 Пример 3: MIN=0&lt;br /&gt;
 Правило: --snapshot &amp;quot;important-*&amp;quot; --min-snapshots 0&lt;br /&gt;
 Ветка имеет 10 снимков (2 important-*, 8 других)&lt;br /&gt;
 Результат:&lt;br /&gt;
   - important-* НИКОГДА не удаляются&lt;br /&gt;
   - Остальные 8 могут быть удалены&lt;br /&gt;
 &lt;br /&gt;
 Пример 4: Множественные MIN&lt;br /&gt;
 Правило 1: --snapshot &amp;quot;*&amp;quot; --min-snapshots 3&lt;br /&gt;
 Правило 2: --snapshot &amp;quot;release-*&amp;quot; --min-snapshots 5&lt;br /&gt;
 Ветка имеет 10 снимков (включая release-*)&lt;br /&gt;
 Результат: MIN = 5 (максимальное), можно удалить до 5 снимков&lt;br /&gt;
&lt;br /&gt;
== Удаление правила ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --id &amp;lt;config id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--id&amp;lt;/code&amp;gt; — ID конфигурации из таблицы правил или запретов (получить через &amp;lt;code&amp;gt;cleanup list&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Вывести таблицу ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --type &amp;lt;rule|exclude-rule|log&amp;gt; --format &amp;lt;table|json&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;--type&amp;lt;/code&amp;gt; — тип таблицы: &amp;lt;code&amp;gt;rule&amp;lt;/code&amp;gt; — таблица правил удаления (по умолчанию); &amp;lt;code&amp;gt;exclude-rule&amp;lt;/code&amp;gt; — таблица запретов на удаление; &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; — таблица удаленных снимков&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--format&amp;lt;/code&amp;gt; — формат вывода: &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; — человекочитаемый вывод (по умолчанию); &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; — JSON формат&lt;br /&gt;
== Запуск очистки вручную ==&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup run --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;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;
'''Правило 1: Удаление по времени (TIME mode)'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;*&amp;quot; --time &amp;quot;240h&amp;quot; --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Удалятся снимки старше 240 часов (10 дней) в проектах, начинающихся с &amp;quot;Devel&amp;quot;, в ветке &amp;quot;2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Правило 2: Ограничение количества (MAX mode)'''&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В любом проекте, в ветке &amp;quot;main&amp;quot; всегда будет максимум 20 снимков (независимо от возраста).&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;Devel*&amp;quot; --branch &amp;quot;2025&amp;quot; --snapshot &amp;quot;test*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки, начинающиеся с &amp;quot;test&amp;quot;, в проектах &amp;quot;Devel*&amp;quot; и ветке &amp;quot;2025&amp;quot; '''никогда не удаляются'''.&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы правил ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type rule&lt;br /&gt;
&lt;br /&gt;
[[File:Cleanup rules table.png|center|thumb|1006x1006px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод таблицы запретов ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule&lt;br /&gt;
[[File:Cleanup exclude rule table.png|center|thumb|1009x1009px]]&lt;br /&gt;
&lt;br /&gt;
=== Вывод в JSON формате ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup list --user admin --password admin --type exclude-rule --format json&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;ID&amp;quot;:&amp;quot;018fe552-f390-4110-9545-6ef9cbe1a406&amp;quot;,&amp;quot;MinBranchSnapshots&amp;quot;:0,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-10-13T15:00:14.997004Z&amp;quot;}]&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup delete --user admin --password admin --id b1895877-1f3c-4b12-ac19-3ff4a7bc5416&lt;br /&gt;
&lt;br /&gt;
=== Защита важных снимков ===&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;*&amp;quot; --snapshot &amp;quot;*release*&amp;quot; --min-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Снимки &amp;lt;code&amp;gt;*release*&amp;lt;/code&amp;gt; никогда не удаляются.&lt;br /&gt;
&lt;br /&gt;
=== Ограничение количества снимков ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
В ветке main хранить максимум 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Комбинация MIN и MAX ===&lt;br /&gt;
&lt;br /&gt;
 '''Минимум 5 снимков'''&lt;br /&gt;
 svacer server cleanup add-exclude-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --min-snapshots 5&lt;br /&gt;
 &lt;br /&gt;
 '''Максимум 20 снимков'''&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;main&amp;quot; --snapshot &amp;quot;*&amp;quot; --max-snapshots 20&lt;br /&gt;
&lt;br /&gt;
Результат: в ветке main всегда будет от 5 до 20 снимков.&lt;br /&gt;
&lt;br /&gt;
=== Использование regex ===&lt;br /&gt;
&lt;br /&gt;
 svacer server cleanup add-rule --user admin --password admin --project &amp;quot;*&amp;quot; --branch &amp;quot;re:^feature/JIRA-[0-9]+$&amp;quot; --snapshot &amp;quot;*&amp;quot; --time 168h --max-snapshots 0&lt;br /&gt;
&lt;br /&gt;
Подходит: &amp;lt;code&amp;gt;feature/JIRA-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feature/JIRA-456&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Не подходит: &amp;lt;code&amp;gt;feature/JIRA-ABC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bugfix/JIRA-123&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regex синтаксис ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Паттерн !! Описание !! Пример&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Начало строки || &amp;lt;code&amp;gt;^test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[^x]&lt;br /&gt;
|Отрицание символов&lt;br /&gt;
|^[^m].*$&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Конец строки || &amp;lt;code&amp;gt;test$&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; || Любой символ || &amp;lt;code&amp;gt;a.c&amp;lt;/code&amp;gt; → abc, a1c&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; || Любое кол-во символов || &amp;lt;code&amp;gt;test.*&amp;lt;/code&amp;gt; → test-123&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.+&amp;lt;/code&amp;gt; || Один или более || &amp;lt;code&amp;gt;test.+&amp;lt;/code&amp;gt; → test-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]&amp;lt;/code&amp;gt; || Любая цифра || &amp;lt;code&amp;gt;v[0-9]&amp;lt;/code&amp;gt; → v1, v9&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[a-z]&amp;lt;/code&amp;gt; || Буква (нижний регистр) || &amp;lt;code&amp;gt;[a-z]+&amp;lt;/code&amp;gt; → abc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[A-Z]&amp;lt;/code&amp;gt; || Буква (верхний регистр) || &amp;lt;code&amp;gt;[A-Z]+&amp;lt;/code&amp;gt; → ABC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(a&amp;amp;#124;b)&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; или &amp;quot;b&amp;quot; || &amp;lt;code&amp;gt;(test&amp;amp;#124;prod)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0-9]{2,4}&amp;lt;/code&amp;gt; || От 2 до 4 цифр || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Не поддерживается '''negative lookahead''' &amp;lt;code&amp;gt;(?!...)&amp;lt;/code&amp;gt;. Используйте комбинацию правил и запретов.&lt;br /&gt;
&lt;br /&gt;
Для правил отрицания конкретного элемента возможно использовать сложные правила, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--branch &amp;quot;re:^(.{0,3}|.{5,}|[^m]...|m[^a]..|ma[^i].|mai[^n])$&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное правило выбирает все ветки, кроме &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Cleanup_exclude_rule_table.png&amp;diff=3122</id>
		<title>File:Cleanup exclude rule table.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Cleanup_exclude_rule_table.png&amp;diff=3122"/>
		<updated>2025-10-13T15:03:03Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;cleanup exclude rule table&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Cleanup_rules_table.png&amp;diff=3121</id>
		<title>File:Cleanup rules table.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Cleanup_rules_table.png&amp;diff=3121"/>
		<updated>2025-10-13T15:01:43Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;cleanup rules table&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3069</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3069"/>
		<updated>2025-09-01T15:01:33Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup add max/min snapshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Автоматическое удаление снимков ==&lt;br /&gt;
Удаление происходит раз в час, первое удаление всех подходящих снимков будет через 1 час после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом ServerOperations.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление и заносится отметка в таблицу удаленных снимков.{{Note|text=Если снимок не задан в запрещенных к удалению, то он будет удаляться по минимальному времени, среди всех подходящих для него правил.}}&lt;br /&gt;
&lt;br /&gt;
=== Добавление нового правила удаления ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup add-rule --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; --time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt; max-snapshots &amp;lt;max snapshots in branch&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* project — проект в котором искать снимки для удаления&lt;br /&gt;
* branch — ветка в которой искать снимки для удаления&lt;br /&gt;
* snapshot — снимки которые удалять&lt;br /&gt;
* time — время сколько должно пройти после создания снимка, чтобы его удалить, задается в формате Go Duration (например 33h5m). По умолчанию 720 часов (30 дней)&lt;br /&gt;
* max-snapshots - верхняя граница по количеству снимков в ветке. Если снимков &amp;gt; max, удаляются самые старые, чтобы осталось ровно max (time не учитывается). Удаляются снимки, только подходящие под паттерн project\branch\snapshot, но количестве снимков считается во всей ветке (вне зависимости, подходит ли он под паттерн project\branch\snapshot или нет). При значении = 0 данное правило не работает. По умолчанию имеет значение 0. Данный флаг появился в версии 12-0-0.&lt;br /&gt;
&lt;br /&gt;
Флаги для проекта, ветки и снимка можно задавать как имя либо как ID, также в имени может быть знак *, который равен &amp;quot;любому количеству любых символов&amp;quot;. Если данные флаги не заданы, то автоматически подставляется * (любой проект, ветка, снимок). &lt;br /&gt;
&lt;br /&gt;
С версии 12-0-0 в опциях &amp;lt;code&amp;gt;add-rule&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;add-prohibition&amp;lt;/code&amp;gt; можно задавать регулярные выражения: для этого нужно в начале написать &amp;lt;code&amp;gt;re:&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;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup add-prohibition --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; min-snapshots &amp;lt;min snapshots in branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&lt;br /&gt;
* min-snapshots - нижняя граница по количеству снимков в ветке. Пока в ветке снимков ≤ min, в ветке ничего не удаляется правилами cleanup (данное правило применяется к ветке, если хотя бы один из снимков подошел под паттерн project\branch\snapshot). При значении = 0 данное правило не работает (и тогда устанавливается полный запрет на удаление снимков, подходящий под паттерн project\branch\snapshot). По умолчанию имеет значение 0. Данный флаг появился в версии 12-0-0.&lt;br /&gt;
&lt;br /&gt;
Остальные флаги работают аналогично с &amp;lt;code&amp;gt;svacer server cleanup add-rule&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup delete --id &amp;lt;config id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* id — id конфигурации из разрешенных к удалению или запрещенных к удалению&lt;br /&gt;
&lt;br /&gt;
=== Вывести таблицу ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup list --type &amp;lt;rule|prohibition|log&amp;gt; --format &amp;lt;table|json&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* type — тип таблицы, которую нужно вывести &lt;br /&gt;
:*rule — таблица удаляемых снимков&lt;br /&gt;
:* prohibition — таблица запрещенных к удалению&lt;br /&gt;
:* log — таблица удаленных снимков&lt;br /&gt;
* format — формат вывода: table — таблица (человекочитаемый вывод), json&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
'''Добавление нового правила'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup add-rule --user admin --password admin --project Devel* --branch 2025 --time &amp;quot;240h&amp;quot;&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;svacer server cleanup add-prohibition --user admin --password admin --project Devel* --branch 2025 --snapshot test*&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;svacer server cleanup list --user admin --password admin --type prohibition&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Prohibition table.png|thumb|1017x1017px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup list --user admin --password admin --type rule&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Rules table.png|thumb|1012x1012px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup list --user admin --password admin --type prohibition --format json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;DeleteTime&amp;quot;:0,&amp;quot;ID&amp;quot;:&amp;quot;7e2c2a12-3fd4-4bb2-8b3a-1f80d81c3bc5&amp;quot;,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-02-24T09:06:53.794742Z&amp;quot;}]&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;svacer server cleanup delete --user admin --password admin --id 878d1d1a-db1a-42a4-9557-ef568f68cd3e&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3052</id>
		<title>Help:CLI/cleanup</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/cleanup&amp;diff=3052"/>
		<updated>2025-07-16T11:39:45Z</updated>

		<summary type="html">&lt;p&gt;Gribunin: cleanup add info about regexp for add-rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Автоматическое удаление снимков ==&lt;br /&gt;
Удаление происходит раз в час, первое удаление всех подходящих снимков будет через 1 час после запуска сервера.&lt;br /&gt;
&lt;br /&gt;
Применять может только пользователь с доступом ServerOperations.&lt;br /&gt;
&lt;br /&gt;
'''Принцип работы:''' происходит проверка всех снимков на соответствие правилам удаления и правилам на запрет удаления, после этого происходит удаление и заносится отметка в таблицу удаленных снимков.{{Note|text=Если снимок не задан в запрещенных к удалению, то он будет удаляться по минимальному времени, среди всех подходящих для него правил.}}&lt;br /&gt;
&lt;br /&gt;
=== Добавление нового правила удаления ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup add-rule --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; --time &amp;lt;nowiki&amp;gt;&amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* project — проект в котором искать снимки для удаления&lt;br /&gt;
* branch — ветка в которой искать снимки для удаления&lt;br /&gt;
* snapshot — снимки которые удалять&lt;br /&gt;
* time — время сколько должно пройти после создания снимка, чтобы его удалить, задается в формате Go Duration (например 33h5m). По умолчанию 720 часов (30 дней)&lt;br /&gt;
&lt;br /&gt;
Флаги для проекта, ветки и снимка можно задавать как имя либо как ID, также в имени может быть знак *, который равен &amp;quot;любому количеству любых символов&amp;quot;. Если данные флаги не заданы, то автоматически подставляется * (любой проект, ветка, снимок). С версии 12-0-0 в опциях &amp;lt;code&amp;gt;add-rule&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;add-prohibition&amp;lt;/code&amp;gt; можно задавать регулярные выражения, тогда нужно в начале написать &amp;quot;re:&amp;quot; и следующая часть будет считаться регулярным выражением (и тогда нужно будет указывать &amp;quot;.*&amp;quot; вместо &amp;quot;*&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Добавление запрета на удаление ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup add-prohibition --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Флаги работают аналогично с &amp;lt;code&amp;gt;svacer server cleanup add-rule&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Удаление правила ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup delete --id &amp;lt;config id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* id — id конфигурации из разрешенных к удалению или запрещенных к удалению&lt;br /&gt;
&lt;br /&gt;
=== Вывести таблицу ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup list --type &amp;lt;rule|prohibition|log&amp;gt; --format &amp;lt;table|json&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* type — тип таблицы, которую нужно вывести &lt;br /&gt;
:*rule — таблица удаляемых снимков&lt;br /&gt;
:* prohibition — таблица запрещенных к удалению&lt;br /&gt;
:* log — таблица удаленных снимков&lt;br /&gt;
* format — формат вывода: table — таблица (человекочитаемый вывод), json&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
'''Добавление нового правила'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup add-rule --user admin --password admin --project Devel* --branch 2025 --time &amp;quot;240h&amp;quot;&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;svacer server cleanup add-prohibition --user admin --password admin --project Devel* --branch 2025 --snapshot test*&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;svacer server cleanup list --user admin --password admin --type prohibition&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Prohibition table.png|thumb|1017x1017px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup list --user admin --password admin --type rule&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Rules table.png|thumb|1012x1012px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer server cleanup list --user admin --password admin --type prohibition --format json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;Branch&amp;quot;:&amp;quot;2025&amp;quot;,&amp;quot;CreatedBy&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;CreatedById&amp;quot;:&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&amp;quot;DeleteTime&amp;quot;:0,&amp;quot;ID&amp;quot;:&amp;quot;7e2c2a12-3fd4-4bb2-8b3a-1f80d81c3bc5&amp;quot;,&amp;quot;Project&amp;quot;:&amp;quot;Devel*&amp;quot;,&amp;quot;Snapshot&amp;quot;:&amp;quot;test*&amp;quot;,&amp;quot;create_time&amp;quot;:&amp;quot;2025-02-24T09:06:53.794742Z&amp;quot;}]&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;svacer server cleanup delete --user admin --password admin --id 878d1d1a-db1a-42a4-9557-ef568f68cd3e&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gribunin</name></author>
	</entry>
</feed>