# HG changeset patch # User sergey # Date 1382531092 -14400 # Node ID 45a84be3ebb1b137270857ed7f05d29eded917f6 # Parent 8001dc056331c3785a615cbbbe484a32b61aa650 added deltainfo (.drpm) packages support diff -r 8001dc056331 -r 45a84be3ebb1 _test/repo.pl --- a/_test/repo.pl Wed Oct 23 11:49:16 2013 +0400 +++ b/_test/repo.pl Wed Oct 23 16:24:52 2013 +0400 @@ -1,6 +1,8 @@ #!/usr/bin/perl use strict; + + use IMPL::require { Repository => 'Yours::Model::Repository', Sync => 'Yours::SyncRepository', @@ -10,23 +12,28 @@ my @repos = ( { + name => 'update', + dir => '_data/update', + location => 'http://mirror.yandex.ru/opensuse/update/12.3/', + }, + { name => 'gnome', - dir => 'gnome', + dir => '_data/gnome', location => 'http://download.opensuse.org/repositories/GNOME:/STABLE:/3.8/openSUSE_12.3/' }, { name => 'mono', - dir => 'mono', + dir => '_data/mono', location => 'http://download.opensuse.org/repositories/Mono/openSUSE_12.3/' }, { name => 'nvidia', - dir => 'nvidia', + dir => '_data/nvidia', location => 'ftp://download.nvidia.com/opensuse/12.3/' }, { name => 'broken', - dir => 'broken', + dir => '_data/broken', location => 'http://mirror.yandex.ru/opensuse/repositories/KDE:/Extra/KDE_Release_410_openSUSE_12.3/' } ); @@ -42,8 +49,8 @@ }) ->Update($repo); }; - if(my $err = $@) { - print eval { $err->message || $err }, "\n"; + if($@) { + warn $@; } else { print "done\n"; } diff -r 8001dc056331 -r 45a84be3ebb1 lib/Yours/FileValidator.pm --- a/lib/Yours/FileValidator.pm Wed Oct 23 11:49:16 2013 +0400 +++ b/lib/Yours/FileValidator.pm Wed Oct 23 16:24:52 2013 +0400 @@ -67,7 +67,8 @@ } sub Log { - + shift; + warn @_; } 1; \ No newline at end of file diff -r 8001dc056331 -r 45a84be3ebb1 lib/Yours/Model/Repository.pm --- a/lib/Yours/Model/Repository.pm Wed Oct 23 11:49:16 2013 +0400 +++ b/lib/Yours/Model/Repository.pm Wed Oct 23 16:24:52 2013 +0400 @@ -9,6 +9,7 @@ require => { MDParser => 'Yours::Parsers::MDParser', PMDParser => 'Yours::Parsers::PMDParser', + DIMDParser => 'Yours::Parsers::DIMDParser', Uncompress => 'IO::Uncompress::AnyUncompress', IOException => '-IMPL::IOException', ArgException => '-IMPL::InvalidArgumentException', @@ -102,21 +103,30 @@ unless $handler; my %index = map { $_->{type}, $_ } @{ $this->ReadMetadata()->{data} || [] }; - - my $filePrimary = $this->GetLocalFile( $index{primary}{location} ); - - die IOException->new( "File not found", $filePrimary ) - unless -f $filePrimary; + + my %parsers = ( + primary => PMDParser, + deltainfo => DIMDParser + ); - my $hdata = Uncompress->new($filePrimary) - or die IOException->new( "Failed to uncompress file", $filePrimary ); - - PMDParser->new(sub { - my ($meta) = shift; - my $file = $this->GetLocalFile($meta->{location}); - $meta->{location} = $this->GetRemoteLocation($meta->{location}); - &$handler($file,$meta); - })->Parse( { IO => $hdata, no_blanks => 1 } ); + foreach my $db (qw(primary deltainfo)) { + my $file = $index{$db}{location} + or next; + $file = $this->GetLocalFile( $file ); + + die IOException->new( "File not found", $file ) + unless -f $file; + + my $hdata = Uncompress->new($file) + or die IOException->new( "Failed to uncompress file", $file ); + + $parsers{$db}->new(sub { + my ($meta) = shift; + my $file = $this->GetLocalFile($meta->{location}); + $meta->{location} = $this->GetRemoteLocation($meta->{location}); + &$handler($file,$meta); + })->Parse( { IO => $hdata, no_blanks => 1 } ); + } } sub ValidateMetadata { diff -r 8001dc056331 -r 45a84be3ebb1 lib/Yours/Parsers/DIMDParser.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Yours/Parsers/DIMDParser.pm Wed Oct 23 16:24:52 2013 +0400 @@ -0,0 +1,59 @@ +package Yours::Parsers::DIMDParser; +use strict; + +use IMPL::Const qw(:prop); +use IMPL::declare { + base => [ + 'Yours::Parsers::SaxParser' => '@_' + ], + props => [ + onpackage => PROP_RW + ] +}; + +sub CTOR { + my ($this,$handler) = @_; + + $this->onpackage($handler); +} + +sub ProcessRootNode { + my ($this,$node) = @_; + + $this->ReadComplexContent({ + newpackage => 'ProcessPackageRecord' + }); +} + +sub ProcessPackageRecord { + my ($this,$node) = @_; + + my $name = $this->attribute('name'); + my $arch = $this->attribute('arch'); + + my $deltas = $this->ReadComplexContent({ + delta => [{ + 'location:filename' => 'ReadTextNode', + size => 'ReadTextNode', + checksumm => sub { + my $me = shift; + return { + type => $me->attribute('type'), + value => 'ReadTextNode' + } + } + }] + })->{delta}; + + if (my $handler = $this->onpackage) { + foreach my $delta ( @{$deltas || []} ) { + $delta->{name} = $name; + $delta->{arch} = $arch; + $handler->($delta); + } + } + + return; +} + +1; \ No newline at end of file diff -r 8001dc056331 -r 45a84be3ebb1 lib/Yours/Parsers/SaxParser.pm --- a/lib/Yours/Parsers/SaxParser.pm Wed Oct 23 11:49:16 2013 +0400 +++ b/lib/Yours/Parsers/SaxParser.pm Wed Oct 23 16:24:52 2013 +0400 @@ -28,6 +28,7 @@ sub ProcessRootNode { my ( $this, $reader ) = @_; + warn "not implemented"; } sub ReadChildren { @@ -69,22 +70,35 @@ return $text; } +sub ReadComplexContent { + goto &ReadComplexNode; +} + sub ReadComplexNode { my ( $this, $schema ) = @_; if ( ref $schema eq 'HASH' ) { my %data; + + my ($handlers,$aliases); + while(my ($selector,$handler) = each %$schema) { + my ($alias,$node) = split /:/, $selector; + $node ||= $alias; + $handlers->{$node} = $handler; + $aliases->{$node} = $alias; + } $this->ReadChildren( sub { my ( $me, $node ) = @_; my $name = $node->localName; - if ( my $handler = $schema->{$name} ) { + my $alias = $aliases->{$name}; + if ( my $handler = $handlers->{$name} ) { if (ref $handler eq 'ARRAY') { - push @{$data{$name}}, $me->ReadComplexNode($$handler[0]); + push @{$data{$alias}}, $me->ReadComplexNode($$handler[0]); } else { - $data{$name} = $me->ReadComplexNode($handler); + $data{$alias} = $me->ReadComplexNode($handler); } } else { $me->ReadChildren();