Как связать измененные строки с функциями в git-репозитории кода C?

Я пытаюсь построить «тепловую карту» из многолетней истории, хранящейся в репозитории 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 генерировать отдельные фрагменты для каждой измененной функции.

Это не критично для безопасности, поэтому я могу допустить некоторые промахи. Означает ли это, что у меня, вероятно, «две проблемы» ?

11
задан Greg Bacon 18 March 2012 в 22:46
поделиться