¿Hay algún error en el directory en SharpSVN SvnClient.Add ()?

Intento utilizar SharpSVN para automatizar los loggings de Subversion, pero estoy teniendo un problema con el método SvnClient.Add () y creo que puede ser un error. Básicamente, .Add () no ve la ruta como una copy de trabajo, sin embargo, SvnClient.GetUriFromWorkingCopy () lo ve perfectamente. Parece que .Add () está buscando 1 directory más alto de lo que debería y no puedo parecer truco .Add () usando. o …

Mi código a testing está abajo. Replicar señalando la ruta al nivel superior de una copy de trabajo y ejecutar. Cualquier ayuda apreciada!

static void Main(string[] args) { string PathToTest = @"C:\temp\sqlcompare"; SvnClient client = new SvnClient(); SvnAddArgs saa = new SvnAddArgs(); saa.Force = true; saa.Depth = SvnDepth.Infinity; Console.WriteLine(PathToTest); Console.WriteLine(client.GetUriFromWorkingCopy(PathToTest)); try { client.Add(PathToTest, saa); Console.WriteLine(@"Success"); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); } 

Y la salida esto produce:

 C:\temp\sqlcompare https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/ 'C:\temp' is not a working copy 

Agregar una barra inclinada final tampoco funcionará:

 C:\temp\sqlcompare\ https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/ 'C:\temp' is not a working copy 

Antes de que una ruta de acceso local se convierta en una copy de trabajo, necesita una llamada .Checkout () (o alguna salida con otro cliente). Solo puede agregar directorys a una copy de trabajo existente.

La única exception menor a esta regla en SharpSvn es SvnClient.Import (), que es realmente 'svn import' (SvnClient.RemoteImport) seguido de 'svn checkout –force'.

La documentation no está clara en este punto, pero puede hacer algunas conjeturas si echa un vistazo a la enumeración SharpSvn.SvnDepth . Actualmente no hay forma de llamar a SvnClient.Add(targetPath) y hacer que intente agregar todos los elementos targetPath/* targetPath ( targetPath/* ). Debería haber una SvnDepth para esto.

Otra de mis preocupaciones es que Add no parece aplicar la list de ignorar de la copy de trabajo.

Entonces, para hacer lo que quieres hacer, sugiero algo como:

 private void RecursiveAdd(SvnClient client, string targetPath, List<string> ignoreList) { foreach (var fileEntry in Directory.EnumerateFileSystemEntries(targetPath)) { if (ignoreList.Any(fileEntry.Contains)) continue; Runtime.ActiveLog.Info(fileEntry); client.Add(fileEntry, new SvnAddArgs() { Depth = SvnDepth.Empty, Force = true }); if (Directory.Exists(fileEntry)) RecursiveAdd(client, fileEntry, ignoreList); } } public AddPath(string targetPath) { using (var client = new SvnClient()) { var ignoreList = GetIgnore(targetPath); RecursiveAdd(client, targetPath, ignoreList); } } 

Todavía necesita el event handling errores y la mejora general del código (por ejemplo, alnetworkingedor de la list de ignorar), pero debe transmitir el post.

Esto funciona para mí Debe sincronizar su carpeta local desprotegida con la de SVN:

 string _localCheckoutPath = @"C:\temp\sqlcompare"; SvnClient client = new SvnClient(); Collection<SvnStatusEventArgs> changedFiles = new Collection<SvnStatusEventArgs>(); client.GetStatus(_localCheckoutPath, out changedFiles); //delete files from subversion that are not in filesystem //add files to suversion , that are new in filesystem foreach (SvnStatusEventArgs changedFile in changedFiles) { if (changedFile.LocalContentStatus == SvnStatus.Missing) { client.Delete(changedFile.Path); } if (changedFile.LocalContentStatus == SvnStatus.NotVersioned) { client.Add(changedFile.Path); } } SvnCommitArgs ca = new SvnCommitArgs(); ca.LogMessage = "Some message..."; client.Commit(_localCheckoutPath, ca);