La tarea de copy SVN-ANT no funciona, la copy svn de CLI sí, los mismos arguments

Estoy usando SVN ANT versión 1.3.1, ANT 1.7.1, Java 1.6u, y el repository SVN es 1.6 (creo – el file de prod\db\format dice "4").

Tengo dos objectives SVN (me pregunto si la tarea "confirmar" no se está completando antes de que la tarea "copyr" intente ejecutar, por lo que la citaré como parte de mi build.xml).

Estoy intentando labelr un lanzamiento como una versión de producción (parece una tarea bastante común para una construcción ANT que depende de SVN-ANT, ¿verdad?) Puedo hacer lo siguiente en la línea de command:

 svn copy http://svnserver/svn/prod/Production/App \ http://svnserver/svn/prod/Archive/App/1.5 \ -m "Tagging Release of App as Version 1.5" 

y entiendo, por supuesto

 Committed revision 27. 

Sin embargo, cuando bash:

 <target name="check-in" > <svn refid="svn.settings"> <commit message="${application.name} - Committed to Prod" > <fileset dir="${src.dir}"> <include name= "**/*"/> </fileset> </commit> </svn> </target> <target name="tag-version-number" depends="check-in" > <svn refid="svn.settings"> <copy srcUrl="http://svnserver/svn/prod/Production/App/" destUrl="http://svnserver/svn/prod/Archive/App/1.5/" message="Tagging Release of App as Version 1.5"> </copy> </svn> </target> 

Estoy recibiendo errores extraños:

 check-in: tag-version-number: [svn] svn: File not found: revision 28, path '/Production/App/Production/App' [svn] svn: '/svn/prod/!svn/bc/28/Production/summons' path not found: 404 Not Found (http://svnserver) [svn] svn: File not found: revision 28, path '/Production/App/Production/App' [svn] svn: '/svn/prod/!svn/bc/28/Production/summons' path not found: 404 Not Found (http:/svnserver) [svn] <Copy> failed. BUILD FAILED C:\build\promote_prod.xml:210: Can't copy 

¿Me hacen pensar que tal vez el compromiso no se está llevando a cabo hasta que intenta acceder a la ruta en el repository de SVN? Si es así, ¿qué puedo hacer para asegurarme de que espera a que se complete la confirmación? Todo se estaba cometiendo muy bien antes de agregar este nuevo objective "número de versión de label" (y, para el logging, esta es la única vez en el script de compilation que se está ejecutando el "check-in" de destino).

¿Es el problema algo más?

¿Estás usando svn-kit? Si es así, hoy me encontré con el mismo problema al tratar de get algunos scripts de compilation probados y verdaderos migrados a una nueva instancia de Jenkins en el trabajo. Al preparar un lanzamiento oficial, labelmos con el número de lanzamiento y luego extraemos el código basado en la label para buildlo. Al igual que el OP, creo que este debe ser un caso de uso bastante estándar.

Por cierto, ejecute ant con la bandera -v y svnant informará si está utilizando svnkit, javahl o volviendo a la línea de command:

  [svn] Using svnkit [svn] <Export> started ... [svn] export -r HEAD https://foo.com/svn/project 

Lo mejor que puedo decir es que svnant 1.3.1 (y la versión de svnkit de la que depende) simplemente no funciona al 100% con el server SVN 1.7.x. Funciona bien para nosotros para algunos commands, incluida la export, pero cuando llegó el momento de labelr usando svn copy, recibíamos el mismo error descrito anteriormente:

 22:06:48 [svn] copy -rHEAD https://foo.com/svn/project/trunk https://foo.com/svn/project/tags/tag3 22:06:48 [svn] svn: File not found: revision 64, path '/project/trunk/project/trunk' 22:06:48 [svn] svn: '/svn/project/!svn/bc/64/project/trunk' path not found: 404 Not Found (https://foo.com) 

Afortunadamente, un salvador estaba por ahí con el nombre de opticylic. Abra una nueva pestaña en su browser y diríjase a:

https://github.com/opticyclic/svntask

Grabe svntask-1.7-1.0.9.zip desde la sección de Descargas y siga las instrucciones de installation, en gran parte solo para declarar la tarea con el classpath apropiado. El uso de la tarea es ligeramente diferente del tigris 'svnant. Específicamente es

 <copy src="url" dst="url2" commitMessage="tmbg"/> 

en lugar de

 <copy srcUrl="url" destUrl="url2" message="flood"/>, 

y los nuevos svnsettings ya no son compatibles, por lo que tendrá que especificar el nombre de usuario y la contraseña directamente en la label.

Una vez hecho esto, svn copy debería funcionar bien, lo que permite aplicar una label de ant. NB asegúrese de que la tarea svnant de opticylic no vea ninguna de las viejas bibliotecas svnant durante el time de ejecución. Anteriormente tenía las jarras relacionadas con svn en mi ant / lib, así que tuve que eliminarlas para usar el svnant de opticyclic.

Finalmente, me di count de que la export de svn no está soportada por el SVNANT de Opticylic, pero la necesitamos para la construcción en la que estaba trabajando. Como tal, me vi obligado a poner AMBOS SVNANT disponibles para mi compilation. Siempre y cuando especifiques ambos classpaths de forma independiente y (¡importante!) Le des un nombre nuevo a uno de ellos, ya que ambos usan svn como tagname de forma pnetworkingeterminada, deberías poder hacer lo mismo:

 <path id="svnant.classpath"> <fileset dir="lib/svnant"> <include name="*.jar"/> </fileset> </path> <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath"/> <path id="svnant2.classpath"> <fileset dir="lib/svn2"> <include name="*.jar"/> </fileset> </path> <taskdef name="svn2" classname="com.googlecode.svntask.SvnTask" classpathref="svnant2.classpath"/> 

Aquí, he permitido que tigris 'svnant reclame el nombre pnetworkingeterminado de la label' svn 'mientras le da a opticyclic la label svn2. De esta manera, podemos invocar cualquiera en el curso del script de la ant. Solo restring prestar atención a que estás usando la syntax correcta requerida para el svnant que estás usando en un momento dado.

Quizás opticyclic agregará export a su svnant, ahora que tienen algunos nuevos fans. Eso nos permitiría simplificar lo anterior y simplemente usar el último svnant rotundamente.