¿Hay alguna herramienta de fusión para el control de código fuente que entienda el código?

Recientemente he estado trabajando a través de una gran base de código, refactorización y en general mejorando el layout para boost la cobertura. Además, en bastantes files eliminé declaraciones de uso excesivo, moví methods para que una funcionalidad similar esté muy cerca, haya agregado regiones, etc. pero en realidad no haya cambiado la funcionalidad del código en el file.

Mientras tanto, en otras partes del equipo, otros desarrolladores están corrigiendo errores y cambiando líneas de código aquí y allá. Obviamente, cuando se trata de fusionar esto puede ser un problema ya que los numbers de línea ya no coinciden y es posible que los methods se hayan movido.

Ahora, entiendo la regla general de que en un entorno controlado por fuente puede ser peligroso mover los methods, y decidimos que el beneficio superaba el costo. Sin embargo, lo que no entiendo es por qué debería ser así.

Digamos que mi file inicial era una simple calculadora:

public class Calculator { public int Subtract(int a, int b) { return a + b; } public int Add(int a, int b) { return a + b; } } 

Y decidí que quería que los methods fueran alfabéticos:

 public class Calculator { public int Add(int a, int b) { return a + b; } public int Subtract(int a, int b) { return a + b; } } 

Mientras que otro desarrollador corrigió el error en el método de resta

 public class Calculator { public int Subtract(int a, int b) { return a - b; } public int Add(int a, int b) { return a + b; } } 

Una herramienta de combinación estándar probablemente requeriría combinar manualmente estos dos files, pero uno que entendiera la funcionalidad del código sería capaz de conciliar fácilmente estos dos cambios. Lo mismo aplica para eliminar o agregar otros methods, comentarios, regiones o usar declaraciones.

Entonces, para (¡finalmente!) Llegar a la pregunta: ¿hay alguna herramienta de fusión que tenga una comprensión inteligente de la funcionalidad del código y podría fusionar los dos files anteriores sin ninguna intervención humana? ¿Si no, porque no? ¿Hay alguna complicación que haga que este sea un problema sin solución (por supuesto, entiendo que no es tan simple como estoy implicando, pero es imposible por alguna razón que no puedo ver?)

Utilizo C # en mi código fuente y me encantaría algo que funcionara con eso, pero estoy interesado en si esto existe en cualquier parte del mundo de la progtwigción …


Ya estoy realmente preocupado por la longitud de esta pregunta, pero corregido para agregar cómo esperaría que el sistema de fuente inteligente funcione:

Cuando se verificó el file de la calculadora inicial, el sistema analizará el file y creará una jerarquía de la class:

 File: Calculator.cs | |--Class[0]: Calculator | |--Method[0]: Subtract | |--Line[0]: return a + b; | |--Method[1]: Add | |--Line[0]: return a +b; 

(Con líneas adicionales para llaves, etc.)

Cuando controlo mi código (haciendo que los methods sean alfabéticos) actualiza la jerarquía de arriba, de modo que Resta se convierte en Método [1] y Agregar se convierte en Método [0].

El segundo desarrollador verifica su código (que obviamente el sistema de control de origen sabe que estaba basado en el original) y nota el cambio a la primera línea en restar. Ahora, en lugar de encontrar ese número de línea por línea en el file general, sabe que puede encontrarlo como Calculator.cs / Calculator / Resta / 0 y el hecho de que el método haya cambiado de location no importa, aún puede hacer que el fusionar el trabajo.

Creo que el código fuente en la database es una posible respuesta a su pregunta. La idea general es que no tienes files de versión, sino bloques de código de versión. El sistema de control de versiones conoce el código DOM y le permite realizar consultas sobre el código DOM para verificar funciones, classs, qué-tener-usted, para editar, comstackr, etc.

Dado que el order de los methods no necesariamente importa, no se almacenan en la database con ningún order en mente. Cuando revisa la class, puede especificar el order que más le guste (alfabético, público / protegido / privado, etc.). Los únicos cambios que importan son los que cambian el + a un - . No tendrás un conflicto debido a la reorderación de los methods.

Desafortunadamente, SCID todavía es MUY joven y no hay muchas herramientas para eso. Sin embargo, es una evolución bastante interesante en la forma en que uno ve y edita el código.

Editar: Aquí hay otra reference para SCID

Nuestro enfoque con Plastic SCM aún está lejos de ser "completo", pero ya se ha lanzado y puede ayudar en este tipo de situaciones. Eche un vistazo a Xmerge . Por supuesto, los comentarios serán más que bienvenidos y otorgarán algunas licencias gratuitas 😉