62 lines
1.8 KiB
Perl
62 lines
1.8 KiB
Perl
![]() |
package Lemonldap::NG::Manager::Conf::Diff;
|
||
|
|
||
|
use strict;
|
||
|
use Mouse;
|
||
|
use Lemonldap::NG::Manager::Conf::Parser;
|
||
|
|
||
|
*defaultValue = \&Lemonldap::NG::Manager::Conf::Parser::defaultValue;
|
||
|
|
||
|
sub diff {
|
||
|
my ( $self, @conf ) = @_;
|
||
|
my @res;
|
||
|
my @keys = ( [ keys %{ $conf[0] } ], [ keys %{ $conf[1] } ] );
|
||
|
while ( my $key = shift @{ $keys[0] } ) {
|
||
|
|
||
|
# TODO
|
||
|
next if ( $key eq 'applicationList' );
|
||
|
if ( ref $conf[0]->{$key} eq 'HASH' ) {
|
||
|
if ( ref $conf[1]->{$key} ) {
|
||
|
my @tmp = $self->diff( $conf[0]->{$key}, $conf[1]->{$key}, 1 );
|
||
|
for ( my $i = 0 ; $i < @tmp ; $i++ ) {
|
||
|
$res[$i]->{$key} = $tmp[$i] if ( $tmp[$i] );
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
$res[0]->{$key} = $conf[0]->{$key};
|
||
|
}
|
||
|
}
|
||
|
elsif ( ref $conf[0]->{$key} eq 'ARRAY' ) {
|
||
|
die 'TODO';
|
||
|
}
|
||
|
elsif ( exists $conf[1]->{$key} ) {
|
||
|
if ( $conf[0]->{$key} ne $conf[1]->{$key} ) {
|
||
|
$res[0]->{$key} = $conf[0]->{$key};
|
||
|
$res[1]->{$key} = $conf[1]->{$key};
|
||
|
}
|
||
|
}
|
||
|
elsif ( $conf[2] or $conf[0]->{$key} ne $self->defaultValue($key) ) {
|
||
|
$res[0]->{$key} = $conf[0]->{$key};
|
||
|
}
|
||
|
$keys[1] = [ grep { $_ ne $key } @{ $keys[1] } ];
|
||
|
}
|
||
|
while ( my $key = shift @{ $keys[1] } ) {
|
||
|
|
||
|
# TODO
|
||
|
next if ( $key eq 'applicationList' );
|
||
|
if (
|
||
|
(
|
||
|
not ref( $conf[1]->{$key} )
|
||
|
and
|
||
|
( $conf[2] or $conf[1]->{$key} ne $self->defaultValue($key) )
|
||
|
)
|
||
|
or ( ref( $conf[1]->{$key} ) eq 'HASH' and %{ $conf[1]->{$key} } )
|
||
|
)
|
||
|
{
|
||
|
$res[1]->{$key} = $conf[1]->{$key};
|
||
|
}
|
||
|
}
|
||
|
return @res;
|
||
|
}
|
||
|
|
||
|
1;
|