2016-07-15 11 views
1

병합을 설정할 때 TortoiseSvn 클라이언트에는 "병합 불가능한 수정본 숨기기"라는 멋진 체크 박스가 있습니다. SharpSvn을 사용하여 활성화 된 경우 나타나는 개정판 목록을 재현하려고합니다.SharpSvn에서 "병합 가능한 개정판"얻기

병합 추적을 사용

, 로그 대화 상자가 수정 및 개정 분기 전에 즉, 공통 조상 점을 미리 데이트를 합병 이전에 표시됩니다 다음 TortoiseSvn documentation

TortoiseSvn

이 체크 박스를 설명 회색으로 그려져있었습니다. 병합 불가 수정 리비전 숨기기 확인란을 사용하면 이러한 리비전을 완전히 필터링 할 수 있으므로 병합 할 수있는 리비전 만 표시됩니다.

어떻게 SharpSvn 코드에서이 기능을 재현 할 수 있습니까? 병합 대상인 SvnLogEventArgs (또는 비슷한) 목록이 필요합니다.

현재 상태 : 두 지점의 로그를 모두 가져 오는 것으로 나타났습니다. 적절한 svn:mergeinfo 속성을 얻는 방법 또는 일단 얻은 후에는 어떻게해야 할지를 알 수 없습니다.

답변

1

나는 링크를 멀리 연결하고 다음과 유지, 그리고 여기에 내가 함께 결국 무엇을 : 나는주의 것입니다 있지만

using (var client = new SvnClient()) 
{ 
    var release = SvnTarget.FromUri(new Uri(@"https://******/branches/Release")); 
    var trunk = SvnTarget.FromUri(new Uri(@"https://******/trunk")); 

    string trunkMergeinfo, releaseMergeinfo; 
    client.GetProperty(release, "svn:mergeinfo", out releaseMergeinfo); 
    client.GetProperty(trunk, "svn:mergeinfo", out trunkMergeinfo); 
    var relInfos = releaseMergeinfo.Split("\n"); 
    var trunkInfos = trunkMergeinfo.Split("\n"); 

    // This is here because I don't know what will happen once I merge something into trunk. 
    Debug.Assert(relInfos.Except(trunkInfos).Count() == 1,"Too many unknown merge paths"); 

    var trunklist = relInfos.SingleOrDefault(i => i.StartsWith("/trunk:")); 
    var revisions = trunklist.Replace("/trunk:", "").Split(",").SelectMany(t => 
    { 
     // If the log contains a range, break it out to it's specific revisions. 
     if (t.Contains("-")) 
     { 
      var match = Regex.Match(t, @"(\d+)-(\d+)"); 
      var start = int.Parse(match.Groups[1].Value); 
      var end = int.Parse(match.Groups[2].Value); 
      return Enumerable.Range(start, end - start + 1).ToArray(); 
     } 
     else 
      return new[] { int.Parse(t) }; 
    }).Select(x => (long)x); 

    Collection<SvnLogEventArgs> baseRevs; 
    // Why can't this take "trunk" or a property thereof as an argument? 
    client.GetLog(new Uri(@"https://******/trunk"), new SvnLogArgs { Start = 1725, End = SvnRevisionType.Head }, out baseRevs); 
    baseRevs.Reverse().Where(r => !revisions.Contains(r.Revision)).Select(x => x.LogMessage).Dump(); 
} 

바라건대,이는 정신이 많지 않음을, 다른 사람 도움 프로덕션 코드를 넣었는지 확인합니다.이 코드는 빠르며 더러운 버전입니다.