Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » CGI que haga commits y checkouts a CVS Responder al tema
Nuevo tema


Página 1 de 1  [ 4 mensajes ] 
 
Nota 2006-10-13 21:39 @943
Avatar de Usuario
Perlero Nuevo
Registrado: 2006-10-13 17:59 @791
Mensajes: 5
CGI que haga commits y checkouts a CVS
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.


Nota 2006-10-14 06:26 @310
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
* Subversion es más simple de manejar que CVS, y existen módulos Perl para manejarle, también.
* No entiendo muy bien cómo es posible que se construya el zip antes de terminar el checkout. Si tu le pides que haga un checkout, deberías esperar a que terminara, para después hacer el zip.


Nota 2006-10-14 09:31 @438
Avatar de Usuario
Creador de Perl en Español
Registrado: 2003-10-15 16:52 @744
Ubicación: México
Mensajes: 1163
Creo que se te podría ayudar mejor si pones el pedazo de código que tiene el problema. Yo tampoco entiendo muy bien el problema, y pues sin ver el código es muy díficil que se te pueda decir que es lo que está fallando.

Saludos

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota 2006-10-17 22:54 @995
Avatar de Usuario
Perlero Nuevo
Registrado: 2006-10-13 17:59 @791
Mensajes: 5
Código CGI
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#####################################CGI######
#!/usr/bin/perl -w

 use CGI ':standard';
 use CGI::Carp qw(fatalsToBrowser);
 use strict;



#------------------------------------[configure]

 my $carpeta_checkout = "/var/www/cvs/tmp/checkout/";
                #Path where folders are downloaded from cvs

 my $carpeta_commit = "/var/www/cvs/tmp/commit/";
                #Path where folders are uploaded to commit

 my $url_commit = "http://cvs.lap/tmp/commit";
                #Commits URL
 my $url_checkout = "http://cvs.lap/tmp/checkout";
                #Checkouts URL
 my $url_cvsweb = "http://cvs.lap/cgi-bin/cvsweb";
 
 my $str_commitmsg = "El servidor ha intentado hacer commit. Verificalo";


 my  $str_action = param('action')||0;
 my  $zipfile = param('file')||0;

#UPLOAD MODULES

if($zipfile)
         {
          $zipfile =~ s/ /_/gi;
          $zipfile =~ s!^.*(\\|\/)!!;
          #store the file
          open(hFILE, ">$carpeta_commit/$zipfile")||die("NO se pudo crear el archivo");
          binmode(hFILE);                
          while (my $bitsraed = read( $zipfile, my $buffer, 1024) )
            {print hFILE $buffer;}
          print redirect('http://cvs.lap/tmp/commit/');
         }

#MODULO1
  if($str_action eq "omodulo1")
            {
              print redirect('http://cvs.lap/tmp/checkout/');
                my $path_sh_checkout="/var/www/cvs/sh/omodulo1.sh";
                #Path to checkout.sh script for  module1
              system("cd $carpeta_checkout && rm -fr * && $path_sh_checkout");
            }

  elsif($str_action eq "modulo1")
             {
               my $path_sh_commit="/var/www/cvs/sh/mmodulo1.sh";
               #Path to commit.sh script for module1
               system("cd $carpeta_commit && unzip modulo1.zip");
               print"Content-type: text/html\n\n";             
               system("sh $path_sh_commit");
               system("sleep 11");
               system("cd $carpeta_commit && rm -fr *");
              }
             }

###Y asi tengo otros elsif para los otros dos modulos


Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
######################omodulo1.sh
cd /var/www/cvs/tmp/checkout;

cvs -d:pserver:www-data@lap:/cvsroot/ checkout modulo1;

zip -r modulo1.zip modulo1;

#################################

Y otro parecido para el commit. Lo tuve que hacer así porque Perl siempre me cambiaba el nombre de usuario y la ruta del repositorio.
Como pueden ver el CGI esta muy limitado.
Ojalá me puedan ayudar


Responder al tema  [ 4 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO