Ayuda con un CGI que haga
checkouts y
commits a un CVS.
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:
unzip module.zip && cd module && cvs -d:pserver:apache@lapromero.net:/cvsroot update && cvs -d:pserver:apache@lapromero.net:/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.