summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--rpm-find-leaves23
-rw-r--r--urpm.pm6
-rw-r--r--urpme67
-rw-r--r--urpmi.spec12
5 files changed, 63 insertions, 47 deletions
diff --git a/Makefile b/Makefile
index 3fb27138..b411168b 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ URPMIDIR = $(PREFIX)/var/lib/urpmi
URPMIDIR2 = $(PREFIX)/etc/urpmi
LOCALEDIR = $(PREFIX)/usr/share/locale
CFLAGS = -Wall -g
-LIBRPM = -lrpm -lrpmio `perl -e 'use rpmtools; rpmtools::version_compare(qx(rpm -q --qf %{VERSION} rpm), "4.0.3") >= 0 and print "-lrpmdb"'` -lz -lbz2 -I/usr/include/rpm -lpopt
+LIBRPM = -lrpm -lrpmio -lrpmdb -lz -lbz2 -I/usr/include/rpm -lpopt
NAME = urpmi
TAR = $(NAME).tar.bz2
diff --git a/rpm-find-leaves b/rpm-find-leaves
index 32d9668c..5c7fb496 100644
--- a/rpm-find-leaves
+++ b/rpm-find-leaves
@@ -2,21 +2,24 @@
@ARGV and die "usage: rpm-find-leaves\n";
-use rpmtools;
-
-$db = rpmtools::db_open('');
-rpmtools::db_traverse($db, [ qw(name version release provides requires) ], sub {
- push @packages, $_[0];
-});
-rpmtools::db_close($db);
+use URPM;
+my @packages;
+{
+ my $db = URPM::DB::open;
+ $db->traverse(sub {
+ my ($p) = @_;
+ $p->pack_header;
+ push @packages, $p;
+ });
+}
foreach my $pkg (@packages) {
- $l{$pkg->{name}} = 1;
- push @{$provides{$_}}, $pkg->{name} foreach @{$pkg->{provides} || []};
+ $l{$pkg->name} = 1;
+ push @{$provides{$_}}, $pkg->name foreach $pkg->provides_nosense;
}
foreach my $pkg (@packages) {
- delete @l{grep { $_ ne $pkg->{name} } @{$provides{$_} || []}} foreach @{$pkg->{requires} || []};
+ delete @l{grep { $_ ne $pkg->name } @{$provides{$_} || []}} foreach $pkg->requires_nosense;
}
print "$_\n" foreach sort keys %l;
diff --git a/urpm.pm b/urpm.pm
index 4bd6f187..e7a79f9a 100644
--- a/urpm.pm
+++ b/urpm.pm
@@ -1879,8 +1879,10 @@ sub install {
return fileno F;
};
$options{callback_close} ||= sub { close F };
- $options{callback_inst} ||= \&install_logger;
- $options{callback_trans} ||= \&install_logger;
+ if (keys %$install || keys %$upgrade) {
+ $options{callback_inst} ||= \&install_logger;
+ $options{callback_trans} ||= \&install_logger;
+ }
@l = $trans->run($urpm, %options);
}
diff --git a/urpme b/urpme
index 20c58a49..395f8254 100644
--- a/urpme
+++ b/urpme
@@ -1,6 +1,7 @@
#!/usr/bin/perl
# Copyright (C) 1999,2002 MandrakeSoft <pixel@linux-mandrake.com>
+# <fpons@mandrakesoft.com>
#
# 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
@@ -20,7 +21,8 @@
use strict;
#use strict qw(subs vars refs);
-use rpmtools;
+use URPM;
+use URPM::Resolve;
use urpm;
#- get I18N translation method.
@@ -64,40 +66,42 @@ if ($matches || $maymatch) {
}
}
-my %toremove; @toremove{@m} = ();
-my $changed = 1;
-while ($changed) {
- $changed = 0;
- local *F;
- open F, "LANGUAGE=C rpm -e --test " . join(" ", keys %toremove) . " 2>&1 |";
- foreach (<F>) {
- if (/package (\S+) is not installed/) {
- delete $toremove{$1};
- } elsif (/is needed by (\S+)/ && ! exists $toremove{$1}) {
- $toremove{$1} = 1;
- $changed = 1;
- }
- }
-}
-if ( ! (@toremove = keys %toremove) ) {
- print _("Nothing to remove.\n");
- exit(0);
-}
+my $urpm = new urpm;
+my $state = {};
-#- check if a package to be removed is a part of basesystem requires.
my %base;
my @base = qw(basesystem);
my %basepackages;
-my $db = rpmtools::db_open('');
-while (defined($_ = shift @base)) {
- exists $basepackages{$_} and next;
- rpmtools::db_traverse_tag($db, /^\// ? 'path' : 'whatprovides', [ $_ ], [ qw(name version release requires) ], sub {
- my ($p) = @_;
- push @{$basepackages{$_} ||= []}, "$p->{name}-$p->{version}-$p->{release}";
- push @base, @{$p->{requires} || []};
- });
+
+#- closure all package asked to be removed.
+{
+ my $db = URPM::DB::open;
+ foreach (@m) {
+ my ($n) = /(.*)-[^-]*-[^-]*/;
+ $db->traverse_tag('name', [ $n ], sub {
+ my ($p) = @_;
+ join('-', ($p->fullname)[0..2]) eq $_ or return;
+ $urpm->resolve_closure_ask_remove($db, $state, $p, undef);
+ }) or die _("unknown package ") . "$_\n";
+ }
+
+ #- if nothing need to be removed.
+ unless (%{$state->{ask_remove} || {}}) {
+ print _("Nothing to remove.\n");
+ exit(0);
+ }
+
+ #- check if a package to be removed is a part of basesystem requires.
+ while (defined($_ = shift @base)) {
+ exists $basepackages{$_} and next;
+ $db->traverse_tag(/^\// ? 'path' : 'whatprovides', [ $_ ], sub {
+ my ($p) = @_;
+ push @{$basepackages{$_} ||= []}, join '-', ($p->fullname)[0..2];
+ push @base, $p->requires_nosense;
+ });
+ }
}
-rpmtools::db_close($db);
+
foreach (values %basepackages) {
my $n = @$_;
foreach (@$_) {
@@ -105,6 +109,7 @@ foreach (values %basepackages) {
}
}
my $base_str = '';
+my @toremove = keys %{$state->{ask_remove}};
foreach (@toremove) {
my $rn = $base{$_};
if ($rn) {
@@ -121,8 +126,8 @@ if (@toremove > @l && !$auto) {
print STDOUT "$msg:\n@toremove\n$askok" . _(" (Y/n) ");
<STDIN> =~ /[$noexpr]/ and exit 0;
}
-system("rpm", "-e", @toremove);
+$urpm->install('/', \@toremove, {}, {});
sub toMb {
my $nb = $_[0] / 1024 / 1024;
diff --git a/urpmi.spec b/urpmi.spec
index def19fbc..b732af5f 100644
--- a/urpmi.spec
+++ b/urpmi.spec
@@ -2,14 +2,14 @@
Name: urpmi
Version: 3.9
-Release: 1mdk
+Release: 2mdk
License: GPL
Source0: %{name}.tar.bz2
Source1: %{name}.logrotate
Summary: User mode rpm install
Requires: eject webfetch perl-DateManip >= 5.40
-PreReq: perl-Locale-gettext rpmtools >= 4.3-2mdk perl-URPM >= 0.50
-BuildRequires: bzip2-devel gcc-c++ gettext rpm-devel rpmtools
+PreReq: perl-Locale-gettext rpmtools >= 4.3-6mdk perl-URPM >= 0.50-2mdk
+BuildRequires: bzip2-devel gcc-c++ gettext rpm-devel >= 4.0.3
BuildRoot: %{_tmppath}/%{name}-buildroot
BuildArch: noarch
@@ -144,6 +144,12 @@ fi
%changelog
+* Tue Jul 23 2002 François Pons <fpons@mandrakesoft.com> 3.9-2mdk
+- updated urpme to use perl-URPM and speed it up (no more
+ rpm -e --test ...).
+- updated rpm-find-leaves to use perl-URPM.
+- dropped build requires to rpmtools (but need rpm >= 4.0.3).
+
* Tue Jul 23 2002 François Pons <fpons@mandrakesoft.com> 3.9-1mdk
- updated to use perl-URPM >= 0.50.