Где я могу найти терпение diff?

На этом сайте хорошо сказано, что терпение diff Bram Cohen обнаружено на базаре как разность по умолчанию и как опция с git diff, но мне трудно создать независимую автономную программу, которая реализует эту конкретную diff.

Например, я хотел бы применить терпение diff к perforce diffs, и это довольно ясно с каноническим примером кода "frobnitz", как лучше терпение:

enter image description here

В терминале справа вызывается git diff с флагом --patience.

Я также установил diff-highlight perl script, задачей которого является инвертирование цветов по согласованным линиям между первым и последним различными разделами этих строк. На левой стороне есть пример, где это не очень помогает, но я дам ему слайд, потому что, по крайней мере, там есть точка с запятой... В любом случае, улучшения в diff-highlight script не являются предметом этот вопрос.

В дополнение к вопросу о том, где найти независимую проверку терпения, если кто-нибудь знает, как заставить perforce p4 использовать внешнюю программу diff, это также то, что нужно сделать.

Ответ 1

Возможно, это не так идеально, как мне бы хотелось, но решение отлично с практической точки зрения (и это чертовски хорошая перспектива).

git diff --no-index --patience file1 file2 выполняет задание. (спасибо @StevenPenny)

$P4DIFF переменная определяет внешний diff... мы просто вставляем git diff --patience --no-index в это.

Ответ 2

Я взял на себя смелость переносить терпение в несколько автономную библиотеку, на С#. Это еще рано для библиотеки. Это в основном линейный порт; поэтому он, надеюсь, обладает большей частью стабильности Python.

Помните, что patience находит только самые длинные общие подпоследовательности (в терминах diff, которые означают части файла, которые не изменились). Вам нужно определить, какие добавления и удаления вы сами.

Также помните, что в репозитории Bazaar есть также реализации в Python и C (опять же, реализации решают только проблему LCS):

  • C-версия: кажется, что ценность производительности выше ясности, вы не сможете легко понять алгоритм, прочитав это. Существует также много накладных расходов на код для взаимодействия Python.
  • версия Python: эталонная реализация алгоритма. Похоже, что в основном это повышает прозрачность производительности.

Если вам нужно написать свою собственную реализацию, я бы рекомендовал сначала перенести версию Python, а затем взглянуть на реализацию C, чтобы узнать, как ее ускорить.

Также должна быть реализация в репозитории Git, но я ее не искал.

Ответ 3

Реализация Python для Cohen требует только незначительных настроек (ниже) для автономной работы. Это в двух файлах, копии которых я зацепил от googling "difflib терпение":

http://stuff.mit.edu/afs/athena/system/i386_deb50/os/usr/share/pyshared/bzrlib/patiencediff.py а также http://stuff.mit.edu/afs/athena/system/i386_deb50/os/usr/share/pyshared/bzrlib/_patiencediff_py.py

Первый файл можно запустить из командной строки примерно как diff. Вторая - реализация внутренних циклов на Python. (Один файл? Упражнение для читателя!) В bzrlib есть также C реализация внутренних циклов.

Здесь (с помощью самой программы) являются мои патчи, чтобы заставить их работать автономно:

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$

Ответ 4

Для реализации javascript, с улучшениями PatienceDiff для определения вероятных смещенных линий (названных "PatienceDiffPlus"), см. https://github.com/jonTrent/PatienceDiff.