2012-06-08 2 views
1

LibGit2Sharp에서 TreeChanges을 반복하는 가장 좋은 방법은 무엇입니까?LibGit2Sharp의 diff 변경 반복

.Patch 속성에 액세스하면 전체 내용을 검색합니다. 이것은 나를 위해 충분하지 않다 ... 이상적으로 나는 diff 라인을 반복 할 수 있고, 각 라인마다 라인의 상태 (수정, 추가, 삭제)를 가져 와서 자신의 출력을 빌드 할 수 있기를 바란다.

업데이트 :

의 내가 내 자신은 diff 출력을 구축하고자한다고 가정 해 봅시다. 내가하고 싶은 것은 변경된 라인을 반복하고, 반복하는 동안 변경 (추가, 제거)의 유형을 확인하고 출력을 구성하는 것입니다. 예를 들어

:

var diff = ""; 
foreach (LineChange line in changes) // Bogus class "LineChange" 
{ 
    if (line.Type == LineChange.TYPE_ADDED) 
     diff += "+"; 
    else 
     diff += "-"; 

    diff += line.Content; 
    diff += "\n"; 
} 

위의 내가 찾고 있어요 유연성 어떤 종류의 단순한 예입니다. 변경 사항을 검토하고 라인 변경 유형에 따라 일부 논리를 실행할 수 있습니다. Patch 속성은 이미 "빌드"되어 있습니다. 한 가지 방법은 구문 분석하는 것이지만, 라이브러리가 먼저 출력을 작성한 다음 바스를 분석하는 것은 어리석은 것처럼 보입니다. 건물 구성 요소를 직접 사용하고 싶습니다.

위의 간단한 예제보다 훨씬 더 많은 코드와 로직이 포함 된 변경 사항을 시각적으로 표시 할 수 있도록 이러한 종류의 기능이 필요합니다.

+1

(* "내 자신의 diff 출력을 올바른 파일 순서대로 빌드하고 싶습니다.") 그리고 이미 사용 가능한 것은 무엇입니까? 이것은 "주문"문제를 명확하게 이해할 수 없으므로 매우 도움이 될 것입니다. – nulltoken

+0

@nulltoken 질문을 업데이트했습니다. :) – Tower

+0

당신의 질문과 관련이 없지만, 끔찍한 성능 (O (n²))이 있기 때문에 그런 루프에서 문자열을 절대로 연결해서는 안됩니다. 대신에'StringBuilder' (또는'StringWriter')를 사용하십시오. – svick

답변

2

필자가 볼 수있는 한,이 정보는 libgit2sharp에 의해 노출되지 않지만 blob diffs의 경우 libgit2에 의해 제공됩니다 (그러나 tree diff에는 해당되지 않음). 관련 코드는 ContentChanges.cs이며 특히 생성자 및 LineCallback() 메서드 (트리 비교 코드는 TreeChanges.cs)에 있습니다. 이 때문에

, 당신이 두 가지 옵션이 있다고 생각 :

  1. 방법 git_diff_blobs()를 호출을, 즉 ContentChanges에 의해 내부적으로 사용되는, 자신은 어느 반사를 사용하거나 복사하여 (이것은 NativeMethods의 내부 방법입니다) PInvoke 서명을 프로젝트에 적용하십시오. 대부분 Utf8Marshaler도 필요합니다.
  2. ContentChanges의 코드를 수정하여 필요에 맞게 수정하십시오. 이렇게하면 다른 사람도 사용할 수 있도록 해당 변경에 대한 끌어 오기 요청을 만드는 것이 좋습니다.
2

@svick이 맞습니다. 노출되지 않았습니다.

open an issue/feature request이 주제에 대해 더 자세히 논의하는 것이 유용 할 수 있습니다. 사실, 완전한 블로깅 기반의 diffgram을 드러내는 것은 현재 라이브러리의 "그레인"에 맞지 않을 수 있습니다. 그러나 대부분의 사용자에게 도움이되는 시나리오/유스 케이스를 제시 할 수 있다면 API를 확장하기 위해 일부 연구가 투자 될 수 있습니다.후 공정

  • 잠재적 인 리드
  • Neil Fraser's "Diff Strategies" paperSO question를 참조 파일의 이전 버전에 대한 현재의 생산 패치 :이 옵션 옆에

    는 다른 솔루션이있을 수 있습니다 diff 도구가 목표로 삼을만한 전략과 잠재적 인주의 사항의 큰 원천입니다
  • DiffPlex, 작업 시각화 도구로,뿐만 아니라 좀 더 작업으로
  • 이 하나라도 시각화의 다음과 같은 종류의 비슷한을 달성 할 수

p4merge http://images.macworld.com/images/news/graphics/132450-perforce.jpg

(억지로 4 뷰어에서) 영감 수 있습니다

참고 : 이것을 쉽게하기 위해 libgit2 diffing options을 C#으로 노출하는 것이 유용 할 수 있습니다.