Comparer 2 fichiers JIL

Jildiff permet de générer un script à partir de la différence de 2 fichiers jil. On utilise généralement ce script avant une mise en prod afin de connaître ou de limiter les changements.
POPULARITE :
769 visites
Principe
Limiter le périmètre d’une mise en production permet de limiter l’impact et donc les risques d’erreur. Ceci est d’autant plus vrai si le JIL est strictement limité aux changements.
Appel
Le principe est de comparer un JIL avec un referentiel indiqué par le paramètre JIL. Le Jil à comparer est passé dans l’entrée standard.
jildiff.pl JIL=Referential.jil [DEL=(y|n)] < jil_to_insert.JIL > diff.jil
JilDiff.pl (PERL)
Script Perl.
#!/usr/bin/perl
%Info = (
'name' => 'JilDiff',
'desc' => 'This script gives the differences beetween 2 Jils, this allows to know the changes before insertion. ',
'usage' => 'jildiff.pl JIL=Referential.jil [DEL=(y|n)] < jil_to_insert.JIL > diff.jil',
'author' => 'E. Angenault',
'license' => 'GNU GPL',
'website' => 'http://ordonnancement.org',
'input' => 'jil file',
'parameters'=>
( 'jil'=> 'Jil file name used as the referential',
'del'=> 'y: if jobs exist in referential but not in the new jil, these jobs will be marked as delete_job.' ),
'return' => 'jil file' );
#-----------------------------------------------------------------#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#-----------------------------------------------------------------#
# Display help screen if no args specified
Help(%Info);
# get command line parameters
GetArgs();
$del='n'
unless $del;
$Val{' job_type'}++;
# Source est nouveau JIL
# Target est la cible qui contient deja des informations
open(FILE,$jil);
while (<FILE>) {
if (s/^\s*(insert|update|delete)_job: (\S*)//) {
$job = $2;
$Target{$job."\t insert_job"} = $2;
$Target{$job."\t job_type"} = $3;
$T{$job}++;
}
if (/^\s*([\w\_]*?): (.*)\s*$/) {
$Target{$job."\t".$1} = $2;
$Val{$1}++;
}
}
while (<STDIN>) {
if (s/^\s*(insert|update|delete)_job: (\S*)//) {
$job = $2;
$Source{$job."\t insert_job"} = $2;
$Source{$job."\t job_type"} = $3;
$S{$job}++;
}
if (/^\s*([\w\_]*?): (.*)\s*$/) {
$Source{$job."\t".$1} = $2;
$Val{$1}++;
}
}
# On prend la source
foreach $j (sort keys %T) {
# Job dans l'instance mais pas dans le gabarit => DELETE
$k = $j."\t insert_job";
# print "\n\n/* $j */\n";
if ($Source{$k} eq '') {
print "\ndelete_job: $j\n"
if ($del ne 'n');
}
# Sinon UPDATE
else {
$update = '';
foreach $v (sort keys %Val) {
$k = $j."\t".$v;
if (($Target{$k}) ne ($Source{$k})) {
if ($Target{$k} ne '') {
$update .= "#\t$v: $Target{$k}\n";
}
$update .= "\t$v: $Source{$k}\n";
}
}
print "\nupdate_job: $j\n$update"
if ($update ne '');
}
}
# Ce qui est dans la source mais pas dans la cible
foreach $j (sort keys %S) {
$k = $j."\t insert_job";
if ($Target{$k} eq '') {
# print "\n\n/* $j */\n";
print "\ninsert_job: $j\n";
foreach $v (sort keys %Val) {
$k = $j."\t".$v;
if ($Source{$k} ne '') {
print "\t$v: $Source{$k}\n";
}
}
}
}
sub GetArgs {
local(%Default) = @_;
# Parametres en arguments
foreach (@ARGV) {
($var,@Val) = split('=');
$val = join('=',@Val);
if ($val eq 'STDIN') {
while (<STDIN>) {
chop;
if (@Head) {
@Infos{@Head} = split(/\t/);
foreach $k (keys %Infos) {
push(@{$k},$Infos{$k});
}
}
else {
@Head = split(/\t/);
}
}
}
else {
${$var} = $val
if ($var !~ s/^\!//);
}
}
# parametres en ligne de commande
# parametres par defaut
foreach $d (keys %Default) {
${$d} = $Default{$d}
unless ${$d};
}
}
sub Help {
%Info=@_;
if ($HELP) {
print $Info{'name'}."\n\n";
print $Info{'desc'}."\n";
exit;
}
}
Télécharger PERL (3679 octets)
|
Le document issu de http://Ordonnancement.org est mis à disposition sous les termes de la licence Creative Commons,
vous pouvez l'utilisez dans vos documents à condition de citer l'auteur
E. Angenault, vous êtes aussi libre de le modifier. Par contre, vous devez le redistribuer dans les mêmes conditions et la commercialisation ne peut se faire qu'avec l'accord de l'auteur. |
/BOUCLE_Source>