Obtener svn diff para mostrar la function C ++ durante la confirmación

Cada vez que hago un ciclo de commit en svn, examino el diff al escribir mis comentarios. Pensé que sería muy bueno mostrar la function real en la que hice las modificaciones cuando se muestra la diferencia.

Revisé esta página , que mencionó que la opción -p mostrará la function C en la que se encuentra el cambio. Sin embargo, cuando intenté usar la opción -p con algún código C ++, generalmente devuelve el especificador de acceso (privado, público, protegido, etc.), que no es terriblemente práctico.

Me di count de que hay una opción -F para diff que hace lo mismo que -p, pero toma una expresión regular especificada por el usuario. Me preguntaba: ¿hay una expresión regular simple para que coincida con una function de C ++? Parece que eso sería todo lo que es necesario para que esto funcione.

Pasaría un time mirando esto yo mismo, pero el trabajo está en modo crujiente y esto parecía ser algo que mucha gente encontraría útil, así que pensé en publicarlo aquí.

EDITAR: No estoy buscando algo que sea una expresión retrospectiva slam-dunk, pero encontraría algo que simplemente encontraría la definición de function más cercana sobre el área diff. El hecho de que no sería nada perfecto, y algo problemático, está bien para mí. Siempre y cuando funcione bien, tal vez el 60% del time sería una mejora significativa de la productividad en mi humilde opinión.

¿Hay una expresión regular simple para que coincida con una function de C ++? No.

¿Hay una expresión regular (compleja) para que coincida con un C ++? Quizás o podría ser posible escribir uno.

Pero diría que las expresiones regulares no son fáciles de realizar (dado que quieres algún tipo de coincidencia de excat) ni son la herramienta adecuada para esa tarea.

Solo piense en un caso como este. ¿Cómo manejarías esto?

void (*function(int, void (*)(int)))(int); func1(int), func2(double); double func3(int); 

La única solución real es usar un analizador usando yacc / lex. Cuál para su caso de uso por supuesto no hace nada.

Así que o bien hackear juntos algunas expresiones regulares incompletas que se ajustan a la mayoría de las firmas de funciones en su código

Si va a aplicar esto solo a sus compromisos, le recomendaría hacer un hábito de agregar un comentario de compromiso a la function, por ejemplo:

 void something () { ... some thing = 1; ... } 

a

 void something () // last change by me: a better value for thing { ... some thing = 2; ... } 

mostrará la function y su comentario con las ediciones. Como beneficio adicional, otras personas podrán entender lo que estás haciendo.

TortoiseSVN utiliza las siguientes expresiones regulares para el soporte de autocompletado en su dialog de confirmación para files C ++:

 .h, .hpp, .hxx = ^\s*(?:class|struct)\s+([\w_]+)|\W([\w_]+)\( .cpp, .c, .cxx = \W(([\w_]+)::([\w_]+))|\W([\w_]+)\( 

Sin embargo, no sé qué tan precisos son.

No sé de una opción en SVN que haga esto, y una solución basada en expresiones regulares probablemente sea una o más de las siguientes:

  • una pesadilla para codificar y mantener, con muchos casos especiales
  • incorrecto y faltan varias funciones válidas de C ++

Necesitas algún tipo de analizador para esto. Es técnicamente posible enumerar todos los posibles casos de expresiones regulares, pero escribir un analizador es la forma correcta de resolver esto. Si tienes time para rodar tu propia solución, verificaría ANTLR, ellos tienen varias gramáticas C / C ++ disponibles en esta página:

Listas de Gramática ANTLR