12

このサイトでは、Bram Cohen の忍耐力の diff がデフォルトの diff として、また git diff のオプションとして bazaar にあるとよく答えられていますが、この特定の diff アルゴリズムを実装する独立したスタンドアロン プログラムを調達するのは難しいと感じています。

たとえば、Perforce diff に忍耐力の差分を適用したいと思います。標準的な "frobnitz" コード例を見ると、忍耐力の差分の方が優れていることがよくわかります。

ここに画像の説明を入力

右側の端末はgit diff--patienceフラグを付けて を呼び出しています。

また、perl スクリプトもセットアップしました。このdiff-highlightスクリプトの仕事は、一致した行の最初と最後の異なるセクション間で色を反転させることです。左側には、これがあまり役に立たない例がありますが、少なくともセミコロンがあるため、スライドさせます...とにかく、差分ハイライトスクリプトを改善することは、この質問の主題ではありません.

スタンドアロンの忍耐力の差分をどこで見つけるかという問題に加えて、誰かが perforcep4に外部の差分プログラムを使用させる方法を知っているなら、それもやらなければならないことです。

4

5 に答える 5

8

それはおそらく私が望むほど理想的ではありませんが、解決策は実用的な観点からは完全に優れています(そして、それは非常に良い観点です)。

git diff --no-index --patience file1 file2仕事をします。(@StevenPenny に感謝)

$P4DIFF変数は外部差分を定義します...それに詰め込むだけですgit diff --patience --no-index

于 2013-04-17T18:09:45.833 に答える
3

Cohen 自身の Python 実装は、スタンドアロンで実行するために、わずかな調整 (以下) のみが必要です。それは 2 つのファイルにあり、そのコピーは「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 のようにコマンド ラインから実行できます。2 つ目は、内部ループの 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$
于 2014-01-11T01:15:56.963 に答える
0

patientdiff の Bazaar 実装は、別の Python モジュールとしても利用できます。

于 2018-08-02T17:05:31.593 に答える