fusionar svn usando el script perl

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 ...

preguntado el 12 de junio de 14 a las 11:06

Podrías probar la biblioteca perl svn stackoverflow.com/questions/2552808/… - que sistema operativo estas usando -

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. -

Estoy probando esta opción ahora $status = qx{svn merge -r39:46 $sourceBranchURL 2>&1}; Pero cuando imprimo $status, no tiene ningún valor. -

2 Respuestas

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.

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 or haz tu propia pregunta.