diff options
author | Angelo Naselli <anaselli@linux.it> | 2015-07-03 23:55:54 +0200 |
---|---|---|
committer | Angelo Naselli <anaselli@linux.it> | 2015-07-03 23:55:54 +0200 |
commit | 8dc0a0866387fc197fd00579bff1367f21422d14 (patch) | |
tree | e9f1f7614bbf7b9944e50daacfe7938726d1771d /lib | |
parent | 9ab21363fe366594d904f01b254f0228335ec9c7 (diff) | |
download | manatools-8dc0a0866387fc197fd00579bff1367f21422d14.tar manatools-8dc0a0866387fc197fd00579bff1367f21422d14.tar.gz manatools-8dc0a0866387fc197fd00579bff1367f21422d14.tar.bz2 manatools-8dc0a0866387fc197fd00579bff1367f21422d14.tar.xz manatools-8dc0a0866387fc197fd00579bff1367f21422d14.zip |
Added tools to urpmi backend
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ManaTools/Shared/urpmi_backend/tools.pm | 505 |
1 files changed, 505 insertions, 0 deletions
diff --git a/lib/ManaTools/Shared/urpmi_backend/tools.pm b/lib/ManaTools/Shared/urpmi_backend/tools.pm new file mode 100644 index 00000000..8fb03bf3 --- /dev/null +++ b/lib/ManaTools/Shared/urpmi_backend/tools.pm @@ -0,0 +1,505 @@ +# vim: set et ts=4 sw=4: +package ManaTools::Shared::urpmi_backend::tools; + +#============================================================= -*-perl-*- + +=head1 NAME + + ManaTools::Shared::urpmi_backend::tools - urpmi backend tools object + +=head1 SYNOPSIS + + use ManaTools::Shared::urpmi_backend::tools; + + my $urpm_tools = ManaTools::Shared::urpmi_backend::tools->new(); + + +=head1 DESCRIPTION + + This module is a backend to some urpmi funcitionalities + +=head1 SUPPORT + + You can find documentation for this module with the perldoc command: + + perldoc ManaTools::Shared::urpmi_backend::tools + +=head1 SEE also + + ManaTools::Shared::urpmi_backend::DB + +=head1 AUTHOR + + Angelo Naselli <anaselli@linux.it> + +=head1 COPYRIGHT and LICENSE + +Copyright (c) 2015 Angelo Naselli <anaselli@linux.it> + from Rpmdrake: + Copyright (c) 2002 Guillaume Cottenceau + Copyright (c) 2003-2005 MandrakeSoft SA + Copyright (c) 2005-2007 Mandriva SA + Copyright (c) 2008 Aurelien Lefebvre <alkh@mandriva.org> + Copyright (c) 2002-2014 Thierry Vignaud <thierry.vignaud@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2, as +published by the Free Software Foundation. + +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. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +=head1 METHODS + +=cut + +use Moose; + +use strict; +use ManaTools::Shared::urpmi_backend::DB; + +use MDK::Common::File qw(cat_); +use URPM; +use urpm::msg; + +# use Exporter; +# our @ISA = qw(Exporter); +# our @EXPORT = qw( +# get_update_medias +# rpm_description +# urpm_name +# find_installed_fullname +# is_mageia +# is_package_installed +# get_package_id +# ensure_utf8 +# pkg2medium +# fullname_to_package_id +# get_package_by_package_id +# get_package_upgrade +# get_installed_fullname +# get_installed_fullname_pkid +# ); + +#============================================================= + +=head2 object attribute + +=head3 urpmi_db_backend + + a ManaTools::Shared::urpmi_backend::DB object + +=cut + +#============================================================= +has 'urpmi_db_backend' => ( + is => 'rw', + init_arg => undef, + lazy => 1, + builder => '_urpmi_db_backend_init', +); + +sub _urpmi_db_backend_init { + my $self = shift; + + return ManaTools::Shared::urpmi_backend::DB->new(), +} + + +has 'loc' => ( + is => 'rw', + lazy => 1, + init_arg => undef, + builder => '_localeInitialize' +); + +sub _localeInitialize { + my $self = shift; + + my $cmdline = new yui::YCommandLine; + my $locale_dir = undef; + my $pos = $cmdline->find("--locales-dir"); + if ($pos > 0) + { + $locale_dir = $cmdline->arg($pos+1); + } + $self->loc( + ManaTools::Shared::Locales->new( + domain_name => 'manatools', + dir_name => $locale_dir, + ) + ); +} + +#============================================================= + +=head2 get_update_medias + +=head3 INPUT + + $urpm: an urpm object + +=head3 DESCRIPTION + + This method returns a list of update media + (here for convenience, implemented in + ManaTools::Shared::urpmi_backend::DB) + +=cut + +#============================================================= +sub get_update_medias { + my ($self, $urpm) = @_; + + $self->urpmi_db_backend()->get_update_medias($urpm); +} + +#============================================================= + +=head2 ensure_utf8 + +=head3 INPUT + + text: a string that is converted or left to utf8 + +=head3 DESCRIPTION + + This method ensure the given string is utf8 +=cut + +#============================================================= +sub ensure_utf8 { + my ($self, $text) = @_; + return '' if !$text; + + if (utf8::is_utf8($text)) { + utf8::valid($text) and return; + utf8::encode($text); #- disable utf8 flag + utf8::upgrade($text); + } else { + utf8::decode($text); #- try to set utf8 flag + utf8::valid($text) and return; + warn "do not know what to with $text\n"; + } +} + +#============================================================= + +=head2 rpm_description + +=head3 INPUT + +# description: package description field + +=head3 DESCRIPTION + + Retrieve the rpm desctiption + +=cut + +#============================================================= +sub rpm_description { + my ($self, $description) = @_; + ensure_utf8($description); + my ($t, $tmp); + foreach (split "\n", $description) { + s/^\s*//; + if (/^$/ || /^\s*(-|\*|\+|o)\s/) { + $t || $tmp and $t .= "$tmp\n"; + $tmp = $_; + } else { + $tmp = ($tmp ? "$tmp " : ($t && "\n") . $tmp) . $_; + } + } + "$t$tmp\n"; +} + +#============================================================= + +=head2 urpm_name + +=head3 INPUT + + $pkg: package + +=head3 DESCRIPTION + + This method returns the urpm format name e.g. + name-version-release.arch + +=cut + +#============================================================= +sub urpm_name { + my ($self, $pkg) = @_; + + return '?-?-?.?' unless ref($pkg) eq 'URPM::Package'; +# my ($name, $version, $release, $arch) = $pkg->fullname; +# return "$name-$version-$release.$arch"; + + return scalar $pkg->fullname; +} + +#============================================================= + +=head2 is_package_installed + +=head3 INPUT + + $package: package to find (URPM::Package) or package name + +=head3 DESCRIPTION + + This method returns if a package is installed + +=cut + +#============================================================= +sub is_package_installed { + my ($self, $pkg) = @_; + + my $installed = 0; + my $db = $self->urpmi_db_backend()->open_rpm_db(); + if (ref($pkg) eq 'URPM::Package') { + $installed = URPM::is_package_installed(URPM::DB::open(), $pkg); + } + else { + my $version = 0; + $db->traverse_tag_find('name', $pkg, sub { $version = $_[0]->EVR; return ($version ? 1 : 0) }); + $installed = $version ? 1 : 0; + } + + return $installed; +} + +#============================================================= + +=head2 find_installed_fullname + +=head3 INPUT + + $package: package to find (URPM::Package) or package name + +=head3 DESCRIPTION + + This method returns the full name of the package if installed + +=cut + +#============================================================= +sub find_installed_fullname { + my ($self, $p) = @_; + + # we can call it with the name or packge + my $name = ref($p) eq 'URPM::Package' ? $p->name : $p; + + my @fullname; + my $db = $self->urpmi_db_backend()->open_rpm_db(); + $db->traverse_tag('name', [ $name ], sub { push @fullname, scalar($_[0]->fullname) }); + + return @fullname ? join(',', sort @fullname) : ""; +} + + +#============================================================= + +=head2 is_mageia + +=head3 DESCRIPTION + + This method returns if the system is mageia linux + +=cut + +#============================================================= +sub is_mageia { + my $self = shift; + cat_('/etc/release') =~ /Mageia/; +} + +#============================================================= + +=head2 vendor + +=head3 DESCRIPTION + + This method returns if the vendor is mageia or mandriva + +=cut + +#============================================================= +sub vendor { + my $self = shift; + + is_mageia() ? "mageia" : "mandriva"; +} + +#============================================================= + +=head2 get_package_id + +=head3 INPUT + + $package: package (URPM::Package) + +=head3 DESCRIPTION + + This method returns the package id meant as + (name;version-release;arch;vendor) + +=cut + +#============================================================= +sub get_package_id { + my ($self, $pkg) = @_; + + return '?;?-?;?;?' unless ref($pkg) eq 'URPM::Package'; + + return join(';', $pkg->name, $pkg->version . "-" . $pkg->release, $pkg->arch, $self->vendor()); +} + + +#============================================================= + +=head2 get_package_id + +=head3 INPUT + + $p: package (URPM::Package) + $urpm: urpm object + +=head3 DESCRIPTION + + Returns the medium that contains the URPM::Package $pkg + +=cut + +#============================================================= +sub pkg2medium { + my ($self, $p, $urpm) = @_; + return if ref($p) ne 'URPM::Package'; + + return { name => $self->loc()->N("None (installed)") } if !defined($p->id); # if installed + + return URPM::pkg2media($urpm->{media}, $p) || { name => $self->loc()->N("Unknown"), fake => 1 }; +} + +#============================================================= + +=head2 fullname_to_package_id + +=head3 INPUT + + $pkg_string: package fullname + +=head3 DESCRIPTION + + Returns package id meant as "name;varsion-release;arch;vendor" + +=cut + +#============================================================= +sub fullname_to_package_id { + # fullname, ie 'xeyes-1.0.1-5mdv2008.1.i586' + my ($self, $pkg_string) = @_; + chomp($pkg_string); + if ($pkg_string =~ /^(.*)-([^-]*)-([^-]*)\.([^\.]*)$/) { +# TODO NOTE check package kit backend it seems the urpm package_id is "name;varsion-release;arch;vendor" + return join(';', $1, "$2-$3", $4, vendor()); + } +} + +#============================================================= + +=head2 get_package_by_package_id + +=head3 INPUT + + $urpm: urpm object + $package_id: package id (see fullname_to_package_id) + +=head3 DESCRIPTION + + Returns URPM::Package package + +=cut + +#============================================================= +sub get_package_by_package_id { + my ($self, $urpm, $package_id) = @_; + my @depslist = @{$urpm->{depslist}}; + foreach (@depslist) { + if ($self->get_package_id($_) eq $package_id) { + return $_; + } + } + + return; +} + +#============================================================= + +=head2 get_installed_fullname_pkid + + $pkg: package (URPM::Package) or package name (string) + + +=head3 DESCRIPTION + + Returns package id of the given package + +=cut + +#============================================================= +sub get_installed_fullname_pkid { + my ($self, $pkg) = @_; + my $pkgname = ref($pkg) eq 'URPM::Package' ? $pkg->name : $pkg; + my $db = $self->urpmi_db_backend()->open_rpm_db(); + my $installed_pkid; + $db->traverse_tag_find('name', $pkgname, sub { + my ($p) = @_; + $installed_pkid = $self->get_package_id($p); + }); + return $installed_pkid; +} + +#============================================================= + +=head2 get_package_upgrade + + $urpm: urpm object + $pkg: package (URPM::Package) or package name (string) + + +=head3 DESCRIPTION + + Returns package to upgrade + +=cut + +#============================================================= +sub get_package_upgrade { + my ($self, $urpm, $pkg) = @_; + + my $db = $self->urpmi_db_backend()->open_rpm_db(); + $urpm->compute_installed_flags($db); + my @depslist = @{$urpm->{depslist}}; + my $pkgname = ref($pkg) eq 'URPM::Package' ? $pkg->name : $pkg; + + foreach (@depslist) { + if ($_->name =~ /^$pkgname$/ && $_->flag_upgrade) { + return $_; + } + } + + return; +} + + +1;
\ No newline at end of file |