git фильтр для clang-формата с IncludeIsMainRegex - PullRequest
0 голосов
/ 30 марта 2020

Я хочу запускать формат clang при каждой регистрации в любом отредактированном файле .cpp и .h в репозитории git и проверять, чтобы "основной файл включения" был сверху.

Существует опция фильтра для этого в .gitattributes:

*.cpp filter=clang-format-cpp
*.h filter=clang-format-cpp

, для которой соответствующий фильтр может быть локально настроен с

git config --global filter.clang-format-cpp.clean 'clang-format -assume-filename=test.cpp'

Для звонка format, , есть опция IncludeIsMainRegex, которая всегда помещает «основной файл включения» сверху. Например, IncludeIsMainRegex: '(test_?)?$' для файла a.cpp или test_a.cpp, заголовок a.h будет основным включением и, следовательно, помещен сверху.

Однако, когда файл отформатирован с помощью git Фильтр / Clang-формат, это главное включение не помещается сверху.

Задано

.clang-формат :

IncludeIsMainRegex: '(test_?)?$'
IncludeBlocks: Regroup

z. cpp:

#include "z.h"
#include "other.h"
#include <includes.h>
#include <here.h>

Ожидается

z. cpp:

#include "z.h"

#include "other.h"

#include <here.h>
#include <includes.h>

Результат

z. cpp:

#include "other.h"
#include "z.h"

#include <here.h>
#include <includes.h>

Очень вероятно, что файл отправляется в формате clang с использованием stdin / stdout, и поэтому формат clang не знать имя файла (или, скорее, предполагает, что оно тестовое. cpp) и, следовательно, не может определить основное включение.

Один из альтернативных подходов состоит в том, чтобы установить хук перед фиксацией и позволить ему исправить файл на месте при фиксации , Но исправление их при подготовке гораздо более упрощено, чем при фиксации.

Как можно интегрировать формат clang в рабочий процесс git, чтобы автоматически помещать основной включаемый файл поверх?

Для теперь я просто отключил IncludeIsMainRegex: false, и он работает стабильно, независимо от того, вызывается ли clang-format для файла или через фильтр git.

...