Я пытаюсь построить «тепловую карту» из многолетней истории, хранящейся в репозитории git, где единицей детализации являются отдельные функции. Функции должны становиться более горячими, поскольку они изменяются чаще, чаще и с большим количеством измененных непустых строк.
Для начала я изучил вывод
git log --patch -M --find-renames --find-copies-harder --function-context -- *.c
Я посмотрел на использование Language.Cот Hackage, но, похоже, ему нужна полная единица перевода — расширенные заголовки и все остальное — а не возможность справиться с исходным фрагментом.
Опция --function-context
является новой, начиная с версии 1.7.8. Основой реализации в версии 1.7.9.4 является регулярное выражение:
PATTERNS("cpp",
/* Jump targets or access declarations */
"!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:.*$\n"
/* C/++ functions/methods at top level */
"^([A-Za-z_][A-Za-z_0-9]*([ \t*]+[A-Za-z_][A-Za-z_0-9]*([ \t]*::[ \t]*[^[:space:]]+)?){1,}[ \t]*\\([^;]*)$\n"
/* compound type at top level */
"^((struct|class|enum)[^;]*)$",
/* -- */
"[a-zA-Z_][a-zA-Z0-9_]*"
"|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?"
"|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"),
Оно, кажется, достаточно хорошо распознает границы, но не всегда оставляет функцию в первой строке фрагмента различий, например , с директивами #include
вверху или с фрагментом, содержащим несколько определений функций. Было бы очень полезно указать diff генерировать отдельные фрагменты для каждой измененной функции.
Это не критично для безопасности, поэтому я могу допустить некоторые промахи. Означает ли это, что у меня, вероятно, «две проблемы» ?