• Publicidad

CGI que haga commits y checkouts a CVS

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

CGI que haga commits y checkouts a CVS

Notapor romero » 2006-10-13 21:39 @943

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: 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.
Avatar de Usuario
romero
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2006-10-13 17:59 @791

Publicidad

Notapor explorer » 2006-10-14 06:26 @310

* 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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2006-10-14 09:31 @438

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
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Código CGI

Notapor romero » 2006-10-17 22:54 @995

Sintáxis: [ Descargar ] [ Ocultar ]
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
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
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;

#################################
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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
Avatar de Usuario
romero
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2006-10-13 17:59 @791


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron