fusionar svn usando el script perl
Frecuentes
Visto 256 equipos
1
Este es mi script perl para hacer svn merge.
$dir = 'D:\Transversal Unit\example\ace__project\branches\UAT';
print $dir."\n";
chdir($dir) or die "Fail $!";
$status = system("svn merge -c39,46 $sourceBranchURL");
print $status;
El problema en esto es que cuando se ejecuta la línea de combinación svn, el valor de $status siempre es 0, ya sea que haya conflictos o no. Lo que quiero es que si hay conflictos svn, entonces quiero salir del script y si no hay conflictos, entonces confirme el código. No puedo comprobar si hay conflictos. ¿Puede alguien por favor ayudarme en esto?
Gracias por adelantado ...
2 Respuestas
3
El problema en esto es que cuando se ejecuta la línea de combinación svn, el valor de $status siempre es 0, ya sea que haya conflictos o no.
Eso no es cierto. svn merge
devolverá un estado distinto de cero si la combinación no funcionó en absoluto. Por ejemplo, no tenía un directorio de trabajo limpio. svn merge
devuelve un valor distinto de cero si la combinación funcionó. Y la fusión funciona incluso si hay conflictos.
Hacer un --dry-run
primero y abierto svn merge
como identificador de archivo:
use strict;
use warnings; # I hope in your program, you're actually using these two pragmas
# No you aren't. :-(
# $dir = 'D:\Transversal Unit\example\ace__project\branches\UAT';
use feature qw(say);
use autodie;
my $dir = 'D:/Traversal Unit/example/ace__project/branches/UAT'; #Use forward slashes
open my $merge, '|-', "svn merge -c39,46 --dry-run $sourceBranchURL";
Ahora, puede leer cada línea de salida de su svn merge
Comando y mira si tienes problemas:
my $conflict_found;
while ( my $line = <$merge> ) {
chomp $line;
if ( line =~ /^!/ ) {
say "Conflict found: $line";
$conflict_found = 1;
}
}
if ( $conflict_found ) {
die qq(Conflicts were found. Do this by hand...);
}
# No conflicts, rerun `svn merge` without `--dry-run`
...
De esta manera, puede verificar si hay conflictos antes de ejecutar el comando de combinación. Si no hay conflictos, puede (casi) hacer la combinación de manera segura y sin problemas.
Recuerde que svn si no hay conflictos no significa que la fusión funcionó correctamente. Puede haber un conflicto lógico incluso si las líneas no entran en conflicto:
Archivo original
line #1
line #2
line #3
line #4
print "Foo = " + foo
Cambio en el maletero
line #1
line #2
line #3
foo = "bar"
line #4
print "Foo = " + foo
Cambio en sucursal
line #1
foo = "boof"
line #2
line #3
line #4
print "Foo = " + foo
Estoy asumiendo que la configuración foo
a bar
en el maletero y boof
en la rama hay un conflicto. Sin embargo, la fusión ocurrirá felizmente sin conflictos:
line #1
foo = "boof"
line #2
line #3
foo = "bar"
line #4
print "Foo = " + foo
Respondido el 12 de junio de 14 a las 18:06
Esta es una gran respuesta, pero creo que hay un error tipográfico en la línea que dice "open my $merge, '|-', ...". El '|-' debe ser '-|' (así que leemos la salida de svn en lugar de enviar datos a svn). - Dan R.
0
Con su enfoque de desembolsar los comandos, podría agregar un comando adicional que se ejecuta svn status
y luego analiza la salida en busca de conflictos y toma una decisión basada en esto.
Ver ¿Existe un comando para enumerar los conflictos SVN? para ejemplos de expresiones regulares...
contestado el 23 de mayo de 17 a las 13:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas perl svn or haz tu propia pregunta.
Podrías probar la biblioteca perl svn stackoverflow.com/questions/2552808/… - que sistema operativo estas usando - KeepCalmAndCarryOn
Ya he probado a instalar el módulo Alien::SVN. pero de alguna manera no se está instalando. También leí en alguna parte que este módulo ya no se mantiene. - user3668231
Estoy probando esta opción ahora
$status = qx{svn merge -r39:46 $sourceBranchURL 2>&1};
Pero cuando imprimo $status, no tiene ningún valor. - user3668231