OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Michael van Elst
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-re Date: 13-Nov-2002 09:39:32
Branch: HEAD Handle: 2002111308393200
Modified files:
openpkg-re openpkg-build
Log:
keep installed options when rebuilding installed packages
rebuild packages when binary package in repository does not match options
read options from openpkg-build.rc file
Summary:
Revision Changes Path
1.7 +111 -36 openpkg-re/openpkg-build
____________________________________________________________________________
Index: openpkg-re/openpkg-build
============================================================
$ cvs diff -u -r1.6 -r1.7 openpkg-build
--- openpkg-re/openpkg-build 12 Nov 2002 16:13:57 -0000 1.6
+++ openpkg-re/openpkg-build 13 Nov 2002 08:39:32 -0000 1.7
@@ -34,19 +34,23 @@
##########################################################################
use Getopt::Std;
-use vars qw/$opt_R $opt_r $opt_f $opt_u/;
+use vars qw/$opt_R $opt_r $opt_f $opt_u $opt_U/;
if (open(FH, "< $ENV{'HOME'}/.openpkg-build.rc")) {
while (<FH>) {
- my($opt,$val) = /^\-([Rfru])\s*(.*?)\s*$/;
- $val = 1 unless defined $val;
- eval "\$opt_$opt = '$val';";
+ if (my($opt,$val) = /^\-([Rfru])\s*(.*?)\s*$/) {
+ $val = 1 unless defined $val;
+ eval "\$opt_$opt = '$val';";
+ } else {
+ chomp;
+ push(@ARGV, split(/\s+/, $_));
+ }
}
close(FH);
}
-getopts('R:r:f:u');
-die "usage: $0 [-R rpm] [-r repository] [-f index.rdf] [-u] package [with..]\n"
+getopts('R:r:f:uU');
+die "usage: $0 [-R rpm] [-r repository] [-f index.rdf] [-uU] package [with..]\n"
unless $ARGV[0] =~ /^\S+$/;
##########################################################################
@@ -132,10 +136,15 @@
my($bv,$br) = $b =~ /^(.*?)(?:\-([\d\.]+))?$/;
my($c);
- $c = version_cmp($av,$bv);
- return if $c;
- $c = release_cmp($ar,$br);
- return $c;
+ if ((defined $ar) && (defined $br)) {
+ $c = release_cmp($ar,$br);
+ return $c if $c;
+ }
+ if ((defined $av) && (defined $bv)) {
+ $c = version_cmp($av,$bv);
+ return $c if $c;
+ }
+ return 0;
}
sub vs ($) {
@@ -143,6 +152,11 @@
return "$t->{version}-$t->{release}";
}
+sub vsn ($) {
+ my($t) = @_;
+ return "$t->{name}-$t->{version}-$t->{release}";
+}
+
sub get_config ()
{
my($c,@q);
@@ -195,9 +209,9 @@
return \%map;
}
-sub get_with ($) {
- my($pkg) = @_;
- my(@l) = `$RPM -qi $pkg`;
+sub get_with ($;$) {
+ my($pkg,$fn) = @_;
+ my(@l) = defined $fn ? `$RPM -qi -p $fn` : `$RPM -qi $pkg`;
my(%with);
%with = map { /--define\s*'(\S+)\s+(\S+?)'/ } @l;
@@ -442,13 +456,13 @@
print "# ambigous sources for $name\n";
my($i) = 0;
foreach (@$recs) {
- print "# $i: $_->{name}-$_->{version}\n";
+ print "# $i: ".vsn($_)."\n";
$i++;
}
die "ERROR: ambigous dependency\n";
} else {
$rec = $recs->[0];
- print "# source for $name is $rec->{name}-$rec->{version}\n";
+ print "# source for $name is ".vsn($rec)."\n";
}
return $rec;
@@ -507,9 +521,14 @@
#
sub target_suitable ($$) {
my($target, $with) = @_;
- my($iwith) = get_with($target->{'name'});
+ my($iwith);
my($k,$v);
+ unless ($target->{OPTIONS}) {
+ $target->{OPTIONS} = get_with($target->{'name'});
+ }
+ $iwith = $target->{OPTIONS};
+
while (($k,$v) = each %$with) {
if (exists $iwith->{$k}) {
return 0 if $iwith->{$k} ne $with->{$k}
@@ -549,7 +568,9 @@
if ($i && (@vers = get_versions($i, $cond))) {
foreach (@vers) {
if (target_suitable($i->{$_}->[0], $env->{with})) {
- return ($i->{$_}->[0], 1);
+ if (!$env->{upgrade}) {
+ return ($i->{$_}->[0], 1);
+ }
}
}
}
@@ -572,8 +593,10 @@
if (target_exists($target, $env->{installed})) {
if (target_suitable($target, $env->{with})) {
- print "# $target->{name} is already installed\n";
- return;
+ if (!$env->{upgrade}) {
+ print "# $target->{name} is already installed\n";
+ return;
+ }
}
print "# rebuilding $target->{name}\n";
$target->{REBUILD} = 1;
@@ -589,22 +612,22 @@
foreach (keys %d) {
- # we are still missing a OpenPKG provider in the index... skip it
+ # old index misses a OpenPKG provider in the index... skip it
next if $_ eq 'OpenPKG';
($t,$old) = dep2target($_, $env);
if ($t) {
if ($old) {
- print "# $target->{name} uses $t->{name}-$t->{version} for $_\n";
+ print "# $target->{name} uses ".vsn($t)." for $_\n";
next;
}
# record which targets to keep in blist
if ($k{$_}) {
push(@$blist,$t);
- print "# $target->{name} installs $t->{name}-$t->{version} for
$_\n";
+ print "# $target->{name} installs ".vsn($t)." for $_\n";
} else {
- print "# $target->{name} requires $t->{name}-$t->{version} for
$_\n";
+ print "# $target->{name} requires ".vsn($t)." for $_\n";
}
make_dep($t,$depth+1,$env,$list,$blist);
} else {
@@ -613,7 +636,7 @@
}
}
- print "# adding $target->{name}-$target->{version} to list\n";
+ print "# adding ".vsn($target)." to list\n";
push(@$list, $target);
push(@{$env->{built}->{$target->{name}}->{vs($target)}}, $target);
}
@@ -633,17 +656,28 @@
my($pattern, $env) = @_;
my(@goals,@targets,@keeps,$bonly,$t);
my($name,$r,@vers);
+ my(@todo);
- if ($pattern =~ s/\*+$//) {
- $pattern = '^'.quotemeta($pattern).'';
+ if ($pattern eq 'REFRESH') {
+ @todo = grep {
+ my($n) = $_;
+ (ref $env->{installed}->{$n}) &&
+ grep { $_ ne '-' } keys %{$env->{installed}->{$n}}
+ } keys %{$env->{repository}};
} else {
- $pattern = '^'.quotemeta($pattern).'$';
+ if ($pattern =~ s/\*+$//) {
+ $pattern = '^'.quotemeta($pattern).'';
+ } else {
+ $pattern = '^'.quotemeta($pattern).'$';
+ }
+ @todo = grep(/$pattern/, keys %{$env->{repository}});
}
+
#
- # chose maximum releases
+ # chose maximum releases for goals
#
- foreach $name (grep(/$pattern/, sort keys %{$env->{repository}})) {
+ foreach $name (@todo) {
$r = $env->{repository}->{$name};
@vers = get_versions($r, sub { 1; });
next unless @vers;
@@ -654,7 +688,7 @@
@targets = ();
@keeps = @goals;
foreach $t (@goals) {
- print "# recursing over dependencies for $t->{name}-$t->{version}\n";
+ print "# recursing over dependencies for ".vsn($t)."\n";
make_dep($t,0,$env,\@targets,\@keeps);
}
@@ -678,20 +712,60 @@
#######################################################################
+sub binary_target ($$) {
+ my($t, $fn) = @_;
+ my(%target) = %$t;
+
+ $target{OPTIONS} = get_with($t->{name}, $fn);
+
+ return \%target;
+}
+
+sub make_defines ($$) {
+ my($old, $new) = @_;
+ my(%result);
+ my($k,$v);
+ my($with);
+
+ if ($old) {
+ $old = { %$old };
+ while (($k,$v) = each %$new) {
+ $old->{$k} = $v if exists $old->{$k};
+ }
+ } else {
+ $old = $new;
+ }
+
+ $with = join(' ',map { "--define '$_ $old->{$_}'" } keys %$old);
+ $with = ' '.$with if $with ne '';
+
+ return $with;
+}
+
sub print_list1 ($$$$@) {
my($list,$c,$url,$uncond,$with) = @_;
my($spkg,$bpkg);
+ my($def);
$url .= '/' unless $url =~ m{/$}s;
- $with = join(' ',map { "--define '$_ $with->{$_}'" } keys %$with);
- $with = ' '.$with if $with ne '';
-
foreach (@$list) {
$spkg = $_->{href};
$bpkg = target2rpm($_, $c);
- if ($uncond || $_->{REBUILD} || !-f $bpkg) {
- print "$RPM$with --rebuild $url$spkg || exit 1\n";
+
+ #
+ # rebuild binary package IF
+ #
+ # 'unconditional' option
+ # OR there is no binary package
+ # OR dependency check found that installed package is not suitable
+ # OR existing binary package doesn't satisfy wanted options
+ #
+ if ($uncond || !-f $bpkg || $_->{REBUILD} ||
+ !target_suitable(binary_target($_, $bpkg),$with)) {
+
+ $def = make_defines($_->{OPTIONS}, $with);
+ print "$RPM$def --rebuild $url$spkg || exit 1\n";
}
print "$RPM -Uvh $bpkg\n";
}
@@ -735,7 +809,8 @@
installed => $installed,
repository => $repository,
built => {},
- with => \%with
+ with => \%with,
+ upgrade => ($opt_U+0)
});
die "FATAL: cannot find package\n" unless defined $list;
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]