2013-04-17 3 views
10

이 사이트에서는 Bram Cohen의 인내심 diff가 bazaar의 기본 diff 및 git diff의 옵션으로 잘 알려져 있지만이 특정 diff 알고리즘을 구현하는 독립 실행 형 독립 실행 형 프로그램을 제공하기는 어렵습니다.인내심을 구현 한 곳을 어디에서 확인할 수 있습니까?

예를 들어 나는 차이점을 억지로 인내은 diff를 적용 할, 그리고 인내심은 diff 더 나은 방법 정식 "frobnitz"코드 예제 꽤 분명하다 : 오른쪽에

enter image description here

터미널은 --patience 플래그로 git diff을 호출했습니다.

필자는 diff-highlight 펄 스크립트도 설정했습니다.이 스크립트의 작업은 해당 줄의 처음과 마지막 부분 사이의 일치하는 줄에서 색상을 반전하는 것입니다. 왼쪽면에는 이것이별로 도움이되지 않는 예가 있지만 적어도 거기에서 은 세미콜론 인이기 때문에 슬라이드를 허용합니다 ... 어쨌든 diff-highlight 스크립트의 개선은 이 질문.

독립 실행 형 인내심 diff를 어디서 발견 할 것인가에 대한 질문 외에도, 누군가가 PERFORCE을 외부 diff 프로그램을 사용하는 방법을 알고 있다면, 그것은 또한해야 할 일입니다.

+0

을 나는 두 개의 파일에 그것을 실행하는 자식을 사용하여 무엇? 그건 그냥 안 좋은 것 같아. 그것은 나에게 결코 일어나지 않았다. 이제는 이것이 잘 작동하는 것을 보았습니다. 확실히 사용할 것입니다. 하지만 많은 시스템에는 git이 설치되어 있지 않습니다 ... –

답변

8

아마도 내가 좋아할만큼 이상적이지는 않지만 실용적인 관점에서 볼 때 솔루션은 완벽합니다.

git diff --no-index --patience file1 file2이 작업을 수행합니다. (덕분에 @ StevenPenny)

$P4DIFF 변수는 외부 diff ...을 정의합니다. 우리는 단지 그 안에 git diff --patience --no-index을 채 웁니다.

4

포용 인내의 자유를 somewhat standalone library으로 가져 왔습니다. C#입니다. 아직 도서관 일찍부터입니다. 대부분 라인 단위 포트입니다. 그래서 파이썬의 안정성의 대부분을 가지기를 바랍니다.

patience은 변경되지 않은 파일의 부분을 의미하는 가장 긴 공통 부분 시퀀스 만 찾습니다. determine the additions and removals yourself이 필요합니다.

는 또한 바자 저장소 내에서 (다시 구현 만 LCS 문제를 해결) 파이썬과 C의 구현도 있다는 것을 기억

  • C version : 선명도를 통해 성능을 중시하는 것, 당신은 '원 이것을 읽음으로써 쉽게 알고리즘을 이해할 수있다. Python interop에 대한 많은 코드 오버 헤드가 있습니다.
  • Python version : 알고리즘의 참조 구현. 대부분 성능에 비해 명확한 가치를 부여합니다.

자신 만의 구현체를 작성해야한다면 Python 버전을 먼저 이식하고 C 구현에서 속도를 높이는 방법을 살펴볼 것을 권장합니다.

Git 저장소에도 구현이 있어야하지만 검색하지 않았습니다.

+0

이후 C++에서 문자 별 diff 구현으로 이동했습니다. [here] (http://code.google.com/p/google-diff- match-patch/issues/detail? id = 25), 내 자신의 많은 (utf8 및 바이너리 관련) 향상과 함께. 나는 그것을 'sift'라고 불렀다. 희망을 갖고 언젠가는 세상에 공개 될 것입니다. 그래도 버전을 공유해 주셔서 감사합니다! (광산은 실제로 frobnitz 예에서 잘 작동하지만 참된 인내심을 가지고 실패 할 수도 있습니다.) –

+0

@StevenLu 즐거움, 네가 올바르게 왔기 때문에 기쁩니다. GitHub 프로젝트에 대한 이슈를 열어 놓은 경우에 어떤 효과가 있었는지에 대해 듣고 싶습니다. –

+0

나는 실제로 이것을 발견했다 : https://github.com/leutloff/diff-match-patch-cpp-stl 이제 내가 얻은 것은'wstring'에 기반한 약간 더 오래된 버전을 기반으로하고 올바르게 할 수 없었다. 'string'을 사용하도록 변환하십시오. 그러나 utf-8을 완벽하게 지원하므로 제한 사항을 많이 고려하지 않습니다. 코드 폭을 알고있는 방식으로 utf8을 처리 할 수있는 문자열이 아닌 문자열 구현이 얼마나 잘되어 있는지 잘 모르겠습니다. –

3

Cohen의 자체 Python 구현은 독립 실행 형을 실행하기 위해 (아래) 사소한 조정이 필요합니다.

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

첫 번째 파일 이 약은 diff 같은 명령 줄에서 실행할 수 있습니다 : 그것은 내가 "difflib 인내심을"인터넷 검색에 의해 암초에 걸렸다 사본있는 두 개의 파일에 있습니다. 두 번째는 내부 루프의 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$ 
+0

이것은 완벽합니다 - 감사합니다! Tiac 또는 GitHub에 패치 된 독립 실행 형 버전이 표시되지 않습니다 - 어디서나 게시 했습니까? 그렇지 않다면 나는 기회를 잡을 것이다. – cxw

+0

패치 된 파일의 사본이 아직 없지만 "패치"유틸리티를 사용하여 위의 패치를 원본에 적용 할 수 있다고 생각합니다. – FutureNerd

+0

그리고 나는 당신의 질문을 놓쳤습니다. 아니요, 저는 그것들을 하나의 파일로 결합하지 않았습니다. – FutureNerd

관련 문제