2013-02-01 10 views
5

Also ich benutze SharpSVN (SharpSvn.1.7-x86 1.7008.2243) und ich laufe auf ein Problem. Jedes Mal, wenn ich versuche, die SvnWorkingCopyClient auf einem Repo zu verwenden, der an der Wurzel eines Laufwerks ist (zum Beispiel sagen, ich habe das D:\ Laufwerk, und es ist ein Repo) es wirft einen svn_dirent_is_absolute Fehler auf mich.Kann nicht root lesen

Tatsache In dem einzigen Befehl ich, dass es egal, das finden konnte, war SvnClient.GetUriFromWorkingCopy(string)

Alle Ideen, wie ich dieses Problem lösen könnte (abgesehen meine Arbeitskopie bewegt, oder die Verknüpfung auf dem Dateisystem)? Ich hoffe, einen Weg im Code zu finden oder eine Alternative, um diese Einschränkung zu umgehen (da es scheint, dass SVN 1.7 diese Einschränkung nicht mehr hat).

Hier ist ein Code?

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."); 
       } 
      } 
     } 
    } 
} 

stolperte ich auch über diese http://subversion.tigris.org/issues/show_bug.cgi?id=3535 und http://subversion.tigris.org/ds/viewMessage.do?dsForumId=463&viewType=browseAll&dsMessageId=2456472

Also, da auf diese Weise wieder passiert ist, als sollte nicht dies kein Problem mehr sein?

+0

Ihre zweite Codezeile 'var RootPath = "d: \" ; 'kompiliert nicht (ist das deine eigentliche Quelle?). Weiter unten verweisen Sie 'this.RootPath', das ist eine andere Variable, ist das was Sie vorhaben? –

+0

Ja. Diese sind zur Laufzeit gefüllt, ich habe gerade gezeigt, wofür der Pfad eingestellt wurde. –

+0

Ich habe die Ursache in SharpSvn für dieses Problem gefunden. Es sollte im nächsten Build behoben werden. Es wäre viel einfacher für mich, wenn Sie dies als kleines reproduzierbares Problem hier oder unter [email protected] veröffentlichen könnten. Zeige workingClient.GetVersion ("C: \\", out q) als das Problem mit der Ausnahme Ausgabe ist viel einfacher zu diagnostizieren dann Ihr ganzes Beispiel. –

Antwort

1

SharSVN hat Probleme mit Stammpfaden, wie wir in Mail-Archiven lesen können. Allerdings können wir kleine Hack für Ihren Anlass gemacht:

  1. Runterladen Paket SharpSvn http://sharpsvn.open.collab.net/files/documents/180/5569/SSvnEx-1.7002.1998.zip
  2. Kopieren svnversion.exe zu Ihrem bin-Verzeichnis
  3. Dann brauchen wir eine Hack-Methode zu erhalten 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. Und ändern Sie Ihre falsche Methode full source code

Sicher ist es eine dreckige Arbeit, aber es kann hilfreich sein. Bitte vorsichtig sein mit svnversion.exe Ergebnisse GetVersionHack nicht ideal.

+0

Dies ist nicht ideal. Es wäre fast sinnvoller, das gesamte svn-Verzeichnis vorübergehend an einen anderen Ort zu kopieren und dann die Ergebnisse zu erhalten. –

+1

@ kelton52 Wenn Sie es an einen anderen Ort besser verschieben können, tun Sie es –

+0

Ich kann nicht wirklich, und es ist ein paar Gig Repo ... Es tut mir leid, aber diese Lösung ist zu hacky. –

0

Wenn es sich über den absoluten Pfad beschwert, versuchen Sie stattdessen, den unc Pfad zu definieren. Teilen Sie Ihr Laufwerk D: \, das ist Ihr Svn Repo. Zugriff dann ist

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

A Flickschusterei mit auf ".." Ihr Weg zur Wurzel aus dem aktuellen Verzeichnis auf:

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

Wenn das klappt und es richtig lesen kann, denke ich, dass dies die richtige Antwort ist. –