Estoy intentando construir un mapa de calor “ ” a partir de un historial de varios años almacenado en un repositorio de git donde la unidad de granularidad es funciones individuales. Las funciones deberían calentarse más ya que cambian más veces, con más frecuencia y con más líneas no en blanco cambiadas.¿Cómo asocio líneas cambiadas con funciones en un repositorio git de código C?
Como punto de partida, que examinó la salida de
git log --patch -M --find-renames --find-copies-harder --function-context -- *.c
Miré usando Language.C de Hackage, pero parece querer unidad — ampliado encabezados de una traducción completa y todos — en lugar de ser capaz de hacer frente a una fragmento fuente La opción --function-context
es nueva desde la versión 1.7.8. El fundamento de la aplicación in v1.7.9.4 is a regex:
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]?"
"|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"),
Esto parece reconocer límites razonablemente bien, pero doesn t ’ deje siempre la función como la primera línea del trozo de diferencias, por ejemplo, , con directivas #include
en la parte superior o con un trozo que contiene varias definiciones de funciones. Una opción para decirle a diff que emita trozos separados para cada función modificada sería realmente útil.
Esto no es ’ t de seguridad crítica, así que puedo tolerar algunas fallas. ¿Eso significa que probablemente tenga Zawinski ’ s “two problems”?
¡Pregunta muy interesante! Finalmente algo diferente a "Soy nuevo en git, ¿cómo puedo deshacer un commit?". Esperando que la artillería pesada marche (es decir, VonC) :) – ralphtheninja
¿Podría confirmar que el idioma de origen es C o C++? – gbulmer
@gbulmer El idioma de origen es C. 'git diff' usa el mismo patrón internamente para reconocer definiciones de funciones en C y C++. –