2013-02-01 6 views
5

Так что я использую SharpSVN (SharpSvn.1.7-x86 1.7008.2243), и у меня все время возникает проблема. Каждый раз, когда я пытаюсь использовать SvnWorkingCopyClient на репо, находящемся в корне диска (например, у меня есть привод D:\, и он сам является репо), он вызывает ошибку svn_dirent_is_absolute.Не удается прочитать root

На самом деле единственная команда, которую я мог найти, что не все равно был SvnClient.GetUriFromWorkingCopy(string)

Любые идеи о том, как я мог бы решить эту проблему (кроме перемещения моей рабочей копии, или ссылки на файловой системе)? Я надеюсь найти способ в коде или альтернативу обойти это ограничение (поскольку, похоже, SVN 1.7 больше не имеет этого ограничения).

Вот код?

private void fakeFunction(){ 
    var RootPath="d:\"; 
    using (var client = new SharpSvn.SvnClient()) 
    using(var workingClient = new SvnWorkingCopyClient()) 
    { 
     SvnWorkingCopyVersion workingVersion = null; 
     // Exception happens here 
     if (workingClient.GetVersion(this.RootPath, out workingVersion)) 
     { 
      CurrentRevision = workingVersion.End; 
       // This will resolve just fine 
      var targetUri = client.GetUriFromWorkingCopy(RootPath); 
      var target = SvnTarget.FromUri(targetUri); 
      SvnInfoEventArgs info = null; 
      if (client.GetInfo(target, out info)) 
      { 
       if (workingVersion.End != info.Revision) 
       { 
        System.Collections.ObjectModel.Collection<SvnLogEventArgs> logEventArgs = null; 
        if (client.GetLog(targetUri, out logEventArgs)) 
        { 
         var oldBack = Console.BackgroundColor; 
         var oldFor = Console.ForegroundColor; 
         Console.BackgroundColor = ConsoleColor.DarkMagenta; 
         Console.ForegroundColor = ConsoleColor.White; 
         foreach (var l in logEventArgs) 
         { 
          Console.WriteLine("[{0}-{1}]-{2}", l.Revision, l.Author, l.LogMessage); 
         } 
         Console.BackgroundColor = oldBack; 
         Console.ForegroundColor = oldFor; 
        } 

        System.Console.WriteLine("Repo not up to date."); 
       } 
      } 
     } 
    } 
} 

я наткнулся на эту http://subversion.tigris.org/issues/show_bug.cgi?id=3535 и http://subversion.tigris.org/ds/viewMessage.do?dsForumId=463&viewType=browseAll&dsMessageId=2456472

Так, так как это случилось путь назад, когда, не это не будет проблемой больше?

+0

Ваша вторая строка кода 'вар ROOTPATH ​​=„D: \“ ; 'не компилируется (это ваш фактический источник?). Кроме того, в дальнейшем вы ссылаетесь на 'this.RootPath', это другая переменная, это то, что вы намереваетесь делать? –

+0

Да. Они заполнены во время выполнения, я просто показываю, что путь был установлен. –

+0

Я нашел причину в SharpSvn для этой проблемы. Он должен быть исправлен в следующей сборке. Мне было бы намного легче, если бы вы могли опубликовать это как небольшую воспроизводимую проблему здесь или на [email protected] Показывать workingClient.GetVersion («C: \\», out q), поскольку проблема с выходом исключения намного проще диагностировать, а затем ваш полный пример. –

ответ

1

У SharSVN есть проблемы с корневыми путями, которые мы можем читать в почтовых архивах. Однако мы можем сделал небольшой хак для связи:

  1. Скачать полный пакет sharpsvn http://sharpsvn.open.collab.net/files/documents/180/5569/SSvnEx-1.7002.1998.zip
  2. Скопируйте svnversion.exe в каталог бен
  3. Тогда нам нужен метод халтуру, чтобы получить verison

    public static bool GetVersionHack(string appPath,string targetPath,out long version) 
        { 
         // <param name="appPath">Path to svnversion.exe</param> 
         // <param name="path">Target path</param> 
         // <param name="version">Result version</param> 
    
         Process p = new Process();    
    
         p.StartInfo.UseShellExecute = false; 
         p.StartInfo.RedirectStandardOutput = true; 
         p.StartInfo.FileName = appPath; 
         p.StartInfo.Arguments = targetPath + " -n"; 
         p.Start(); 
    
         //read svnversion.exe result 
         string output = p.StandardOutput.ReadToEnd(); 
         p.WaitForExit(); 
    
         output = output.Replace("M", ""); 
         output = output.Replace("S", ""); 
         output = output.Replace("P", ""); 
    
         //valid results 
         //4123:4168  mixed revision working copy 
         //4168M   modified working copy 
         //4123S   switched working copy 
         //4123P   partial working copy, from a sparse checkout 
         //4123:4168MS mixed revision, modified, switched working copy    
    
         return long.TryParse(output, out version); 
        } 
    
  4. И изменить ваш поддельный метод full source code

Уверен, что это грязная работа, но это может быть полезно. Пожалуйста, Будьте осторожны с результатами svnversion.exe GetVersionHack не идеален.

+0

Это не идеально. Было бы почти целесообразно временно скопировать всю директорию svn в другое место, а затем получить результаты. –

+1

@ kelton52, если вы можете переместить его в другое место, лучше сделать это –

+0

Я не могу на самом деле, и это несколько концертных репо ... Извините, но это решение слишком хаки. –

0

Если он жалуется на абсолютный путь, попробуйте вместо этого определить путь unc. Поделитесь своим диском D: \, который является вашим svn-репо. Затем к нему доступ с помощью

var RootPath="\\<servername>\D$"; 
2

клудж это «..» ваш путь до корня из текущего каталога:

[pwd = C:\USERS\franklin\absrel] 
root = ..\..\.. 
+1

Если это работает и может обмануть ее в правильном ее чтении, я думаю, что это правильный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^