diff options
Diffstat (limited to 'lib/Youri/Submit/Action/DkmsModuleInfo.pm')
-rw-r--r-- | lib/Youri/Submit/Action/DkmsModuleInfo.pm | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/Youri/Submit/Action/DkmsModuleInfo.pm b/lib/Youri/Submit/Action/DkmsModuleInfo.pm new file mode 100644 index 0000000..d1dd4a8 --- /dev/null +++ b/lib/Youri/Submit/Action/DkmsModuleInfo.pm @@ -0,0 +1,111 @@ +# $Id$ +package Youri::Submit::Action::DkmsModuleInfo; + +=head1 NAME + +Youri::Submit::Action::DkmsModuleInfo - extract and commit info from dkms package. + +=head1 DESCRIPTION + +This action plugin extract modalias and description from dkms packages and commit them +on a SVN module. + +=cut + +use warnings; +use strict; +use Carp; +use base qw/Youri::Submit::Action/; +use File::Temp qw/tempdir/; +use File::Basename; +use SVN::Client; + +#- inlineed from MDK::Common::Various +sub chomp_ { my @l = @_; chomp @l; wantarray() ? @l : $l[0] } + +sub _init { + my ($self, %options) = @_; + + croak "undefined svn module" unless $options{svn_module}; + + foreach my $var ('svn_module') { + $self->{"_$var"} = $options{$var}; + } + + return $self; +} + +sub run { + my ($self, $package, $repository, $target, $define) = @_; + croak "Not a class method" unless ref $self; + + my ($dkms_name) = $package->get_canonical_name =~ /^dkms-(.*)$/ or return; + my $package_name = $package->get_name; + my ($kver) = $package_name =~ /^$dkms_name-kernel-(.*)$/ or return; + + my @files = map { $_->[0] } $package->get_files; + my @module_files = grep { m!^(/lib/modules/|/var/lib/dkms-binary/).*\.ko(\.gz)?$! } @files + or return; + + print "Submit::Action::DkmsModuleInfo: proceeding with $package_name\n" if $self->{_verbose}; + + my $tempdir = tempdir(CLEANUP => 1); + my $file = $package->as_file; + my $cmd = "rpm2cpio $file | (cd $tempdir ; cpio --quiet -id)"; + print "Submit::Action::DkmsModuleInfo: doing $cmd\n" if $self->{_verbose}; + if (system($cmd) != 0) { + print "Submit::Action::DkmsModuleInfo: failed!\n" if $self->{_verbose}; + return; + } + + my @fields = qw(description alias); + + my (%modules); + foreach my $file (@module_files) { + print "Submit::Action::DkmsModuleInfo: extracting $file\n" if $self->{_verbose}; + my $module = $file; + $module =~ s!.*/!!; + $module =~ s!\.ko(\.gz)$!!; + $modules{$module}{$_} = [ chomp_(`/sbin/modinfo -F $_ $tempdir$file`) ] + foreach @fields; + } + + eval { + my $svn = SVN::Client->new(); + my $dir = $tempdir . '/' . basename($self->{_svn_module}); + my $revision = $svn->checkout($self->{_svn_module}, $dir, 'HEAD', 0); + my $vdir = $dir . '/' . $kver; + $svn->update($vdir, 'HEAD', 0); + -d $vdir or $svn->mkdir($vdir); + foreach my $module (keys %modules) { + print "Submit::Action::DkmsModuleInfo: adding module $module\n" if $self->{_verbose}; + foreach my $field (@fields) { + my $file = "$vdir/$module.$field"; + $svn->update($file, 'HEAD', 0); + my $exists = -f $file; + open(my $fh, ">", $file); + print $fh map { "$_\n" } @{$modules{$module}{$field}}; + $svn->add($file, 1) if !$exists; + } + } + + $svn->log_msg(sub { $_[0] = \"add dkms info for $dkms_name with kernel $kver" }); + $svn->commit($vdir, 0); + }; + if (my $error = $@) { + print "Submit::Action::DkmsModuleInfo: commit to svn failed ($error)!\n" if $self->{_verbose}; + return; + } + + 1; +} + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2002-2006, YOURI project + +This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. + +=cut + +1; |