La idea es manejar archivos zip donde contenga el contenido de un módulo.
He puesto un servidor con un CVS en mi laptop.
Empezé a trabajar con un equipo. Sólo somos 5 personas pero quiero tener todo organizado asi que uso un repositorio CVS, dos de las personas con las que trabajo son diseñadores y se les hace complicado el uso del CVS desde consola, y otro desarrollador es nuevo con CVS, el otro trabaja con eclipse y a veces tiene problemas al usar el cliente CVS integrado con eclipse. Así que se me hizo fácil hacer un CGI y ponerlo en mi laptop.
Lo que hice fue un php que muestra los módulos, el usuario se logea, selecciona y envía parámetros al cgi; hace un checkout en una carpeta temporal dentro de $chf="/var/www/cvs/tmp/checkout"; de allí el cgi hace un zip y hace un print redirect a la página donde se creó el zip. El problema es que cuando el módulo a hacer checkout es muy grande el CGI me hace el zip antes de que haya terminado de hacer el checkout, así que queda incompleto; lo resolví parcialmente con un print "Content-type..." poniendo una liga a la página para la descarga del zip, y al final hago un system("rm -fr *") dentro de la carpeta $chf. También para el commit pasa lo mismo.
Siento que al llegar al print redirect el cgi termina. He visto los logs del apache y muestra errores de todo, aunque realmente no son errores.
Cabe mencionar que para acceder al repositorio CVS lo hago mediante un system("sh commit.sh"). Esto lo hago porque primero intenté usar el módulo CVS pero ni siquiera lo pude instalar; traté desde cpan y manualmente busqué los errores y al final lo pude instalar pero no quedo bien en el makefile: marca dos errores, así que probé mi cgi en otra máquina donde sí pude instalar el módulo CVS pero no lo pude o supe usar. Tomé ejemplo de cpan pero nada y no encontré algo útil en internet.
Lo que contiene el commit.sh es. Para el commit los usuarios mandan un zip y lo subo a mi lap mediante un multipart/data y todo bien hasta allí pero el problemo viene luego.
- Código: Seleccionar todo
unzip module.zip && cd module && cvs -d:pserver:[email protected]:/cvsroot update && cvs -d:pserver:[email protected]:/cvsroot update commit
Y muy similar para el checkout. Lo hice así porque descubrí que al hacer un system con los mismos comandos Perl siempre me cambiaba el usuario 'apache' por otra cosa. Los erorres del Apache dicen error updating... realmente no son errores. Redireccione los errores con CGI::Carp pero no es lo más apropiado.
Para esto le dí privilegios de escritura a Apache en el CVS.
En general mi cgi funciona pero los usuarios no saben si el commit tuvo éxito; a veces hace los checkouts completos a veces no, a veces redirecciona o muestra el texto, a veces hace el commit pero muestra internal server error. No es nada estable, pero sirve la mayoría de las veces, pido su ayuda para hacerlo.
Estoy usando cvsweb, un mega cgi de freebsd que es muy bueno pero no permite hacer commits ni checkouts, les recomiendo a mis usuarios que despues de un commit chequen que realmente se hizo a traves del cvsweb. Pero no me acaba de convencer esta idea.
Espero su ayuda, he buscado mucho pero no encuntro nada que me ayude a resolver el problema.
De antemano gracias.