¿Dónde puedo encontrar la paciencia implementada?

Está bien respondido en este sitio que la diferencia de paciencia de Bram Cohen se encuentra en bazar como la diferencia pnetworkingeterminada y como una opción con git diff, pero me resulta difícil get un progtwig autónomo independiente que implemente este algorithm de diferencia particular.

Por ejemplo, me gustaría aplicar la paciencia para diffe forzadamente, y es bastante claro con el ejemplo de código canónico "frobnitz" cómo la paciencia diff es mejor:

enter image description here

El terminal de la derecha ha invocado el git diff con el indicador --patience .

También he configurado el script de perl diff-highlight , cuyo trabajo consiste en invertir colors en líneas coincidentes entre la primera y la última sección diferente de esas líneas. El lado izquierdo tiene un ejemplo en el que esto no ayuda mucho pero lo dejaré pasar porque al less hay ese punto y coma allí … De todos modos, hacer mejoras al guión diff-highlight no es el tema de esta pregunta .

Además de la cuestión de dónde encontrar una diferencia de paciencia independiente, si alguien sabe cómo hacer que p4 forzosamente utilice un progtwig de diferencia externa, eso también es algo que tiene que hacerse.

Quizás no sea tan ideal como me gustaría, pero la solución es perfectamente buena desde una perspectiva práctica (y esa es una muy buena perspectiva).

git diff --no-index --patience file1 file2 hace el trabajo. (gracias @StevenPenny)

$P4DIFF variable $P4DIFF define la diferencia externa … simplemente git diff --patience --no-index en eso.

Me tomé la libertad de trasladar la paciencia a una biblioteca algo independiente , está en C #. Todavía es temprano para la biblioteca. Es principalmente un puerto línea por línea; así que con suerte tiene la mayor estabilidad de Python.

Recuerde que la paciencia solo encuentra las subsecuencias comunes más largas (en términos de diferencias significa que partes del file no han cambiado). Tendrá que determinar las adiciones y eliminaciones usted mismo .

También recuerde que dentro del repository Bazaar también hay implementaciones en Python y en C (de nuevo, las implementaciones solo resuelven el problema LCS):

  • Versión C : parece valorar el performance por encima de la claridad, no será fácil comprender el algorithm leyendo esto. También hay una gran cantidad de código de sobrecarga para la interoperabilidad de Python.
  • Versión de Python : la implementación de reference del algorithm. Parece que valora principalmente la claridad sobre el performance.

Si necesita escribir su propia implementación, le recomiendo primero portar la versión de Python, luego mirar la implementación de C para get consejos sobre cómo acelerarla.

También debería haber una implementación en el repository de Git, pero no lo he buscado.

La propia implementación de Python de Cohen solo necesita ajustes menores (a continuación) para ejecutar de forma autónoma. Está en dos files, copys de las cuales enganché buscando en Google "difflib paciencia":

http://stuff.mit.edu/afs/athena/system/i386_deb50/os/usr/share/pyshanetworking/bzrlib/patiencediff.py y http://stuff.mit.edu/afs/athena/system/i386_deb50/ os / usr / share / pyshanetworking / bzrlib / _patiencediff_py.py

El primer file se puede ejecutar desde la command-line más o less como diff. El segundo es la implementación de Python de los loops internos. (¡Un solo file, ejercicio para el lector!) En bzrlib también hay una implementación C de los loops internos.

Aquí (con la ayuda del progtwig en sí) están mis parches para que funcionen de manera independiente:

 Sandy$ patiencediff.py --patience orig/patiencediff.py patiencediff.py --- orig/patiencediff.py +++ patiencediff.py @@ -15,14 +15,20 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +try: + from bzrlib.lazy_import import lazy_import + lazy_import(globals(), """ + import os + import sys + import time + import difflib + """) +except: + import os + import sys + import time + import difflib -from bzrlib.lazy_import import lazy_import -lazy_import(globals(), """ -import os -import sys -import time -import difflib -""") __all__ = ['PatienceSequenceMatcher', 'unified_diff', 'unified_diff_files'] @@ -135,11 +141,18 @@ PatienceSequenceMatcher_c as PatienceSequenceMatcher ) except ImportError: - from bzrlib._patiencediff_py import ( - unique_lcs_py as unique_lcs, - recurse_matches_py as recurse_matches, - PatienceSequenceMatcher_py as PatienceSequenceMatcher - ) + try: + from bzrlib._patiencediff_py import ( + unique_lcs_py as unique_lcs, + recurse_matches_py as recurse_matches, + PatienceSequenceMatcher_py as PatienceSequenceMatcher + ) + except ImportError: + from _patiencediff_py import ( + unique_lcs_py as unique_lcs, + recurse_matches_py as recurse_matches, + PatienceSequenceMatcher_py as PatienceSequenceMatcher + ) def main(args): Sandy$ patiencediff.py --patience orig/_patiencediff_py.py _patiencediff_py.py --- orig/_patiencediff_py.py +++ _patiencediff_py.py @@ -15,11 +15,16 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - +from __future__ import print_function from bisect import bisect import difflib -from bzrlib.trace import mutter +try: + from bzrlib.trace import mutter +except: + import sys + def mutter(msg): + print (msg, file=sys.stderr) __all__ = ['PatienceSequenceMatcher', 'unified_diff', 'unified_diff_files'] Sandy$