OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Michael van Elst
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src openpkg-web Date: 15-Jan-2003 13:15:47
Branch: HEAD Handle: 2003011512154402
Modified files:
openpkg-src/openpkg-tool
openpkg-build.pl openpkg-tool.spec openpkg.pod
openpkg-web news.txt
Log:
optimize get_revdep, add -L and -W option for generating a dependency
list
Summary:
Revision Changes Path
1.34 +86 -34 openpkg-src/openpkg-tool/openpkg-build.pl
1.25 +2 -2 openpkg-src/openpkg-tool/openpkg-tool.spec
1.10 +15 -0 openpkg-src/openpkg-tool/openpkg.pod
1.2812 +1 -0 openpkg-web/news.txt
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-tool/openpkg-build.pl
============================================================================
$ cvs diff -u -r1.33 -r1.34 openpkg-build.pl
--- openpkg-src/openpkg-tool/openpkg-build.pl 14 Jan 2003 12:00:55 -0000 1.33
+++ openpkg-src/openpkg-tool/openpkg-build.pl 15 Jan 2003 12:15:46 -0000 1.34
@@ -29,8 +29,12 @@
$|=1; # autoflush
use strict;
-use vars qw/$opt_R $opt_r $opt_f $opt_u $opt_U $opt_a $opt_A $opt_z $opt_Z $opt_P
$opt_N $opt_E $opt_i $opt_D $opt_p $opt_q $opt_s $opt_S $opt_X $opt_M/;
-my $getopts = 'R:r:f:uUaAzZP:N:E:iD:p:qsSXM';
+use vars qw/
+ $opt_R $opt_r $opt_f $opt_u $opt_U $opt_a $opt_A
+ $opt_z $opt_Z $opt_P $opt_N $opt_E $opt_i $opt_D
+ $opt_p $opt_q $opt_s $opt_S $opt_X $opt_M $opt_L
+ $opt_W/;
+my $getopts = 'R:r:f:uUaAzZP:N:E:iD:p:qsSXMLW';
getopts($getopts);
##########################################################################
@@ -116,7 +120,7 @@
my($cond,$with) = @_;
my(@s,$res);
- return 1 if $cond eq '';
+ return 1 if $cond eq '' || !defined $with;
foreach (split(/\s+/,$cond)) {
if ($_ eq '+') {
@@ -449,9 +453,8 @@
# compute reverse dependency map
#
#
-sub get_revdep ($) {
- my($env) = @_;
- my($i) = $env->{'installed'};
+sub get_revdep ($$) {
+ my($env, $i) = @_;
my($r) = $env->{'repository'};
my($pkg, %dep, %dlist, %rev);
my(@vers,$t);
@@ -481,8 +484,10 @@
next unless $i->{$t->{name}};
next unless $t->{depends};
foreach (depends2pkglist($t->{depends})) {
- $dep{$_}{$t->{name}} = 1;
- push @{$dlist{$_}}, $t;
+ unless ($dep{$_}{$t->{name}}) {
+ $dep{$_}{$t->{name}} = 1;
+ push @{$dlist{$_}}, $t;
+ }
}
}
}
@@ -1389,7 +1394,7 @@
$target->{REBUILD}) {
unless ($env->{revdep}) {
- $env->{revdep} = get_revdep($env);
+ $env->{revdep} = get_revdep($env, $env->{intalled});
}
foreach $t (@{$env->{revdep}->{$target->{name}}}) {
@@ -1407,15 +1412,11 @@
}
#
-# generate build lists for targets matched by pattern
+# grep environment for packages that match a pattern
#
-# all input and output is passed in 'env' hash
-#
-sub build_list ($$) {
+sub search_pattern ($$) {
my($pattern, $env) = @_;
- my(@goals,@targets,@keeps,@conflicts,@bonly,$t);
- my($name,$r,$i,@vers);
- my(@todo,%keep);
+ my(@todo);
#
# handle various patterns
@@ -1446,10 +1447,26 @@
} keys %{$env->{repository}};
}
+ return \@todo;
+}
+
+#
+# generate build lists for targets matched by pattern
+#
+# all input and output is passed in 'env' hash
+#
+sub build_list ($$) {
+ my($pattern, $env) = @_;
+ my(@goals,@targets,@keeps,@conflicts,@bonly,$t);
+ my($name,$r,$i,@vers);
+ my($todo,%keep);
+
+ $todo = search_pattern($pattern, $env);
+
#
# chose sources for goals from repository
#
- foreach $name (@todo) {
+ foreach $name (@$todo) {
$t = undef;
#
@@ -1502,6 +1519,21 @@
return (\@targets, \@bonly, \@conflicts);
}
+sub build_deps ($$) {
+ my($pattern, $env) = @_;
+ my($todo);
+
+ $todo = search_pattern($pattern, $env);
+
+ $env->{revdep} = get_revdep($env, $env->{repository});
+
+ return [ map {
+ $env->{revdep}->{$_}
+ ? ( @{$env->{revdep}->{$_}} )
+ : ( )
+ } @$todo ];
+}
+
#######################################################################
#
@@ -1765,6 +1797,17 @@
}
}
+#
+# print dependency list
+#
+sub print_deps ($) {
+ my($list) = @_;
+
+ foreach (@$list) {
+ print vsn($_),"\n";
+ }
+}
+
#######################################################################
my($config,$url,$repository,$installed,$env,$list,$bonly,$clist);
@@ -1809,7 +1852,11 @@
}
$installed = $opt_Z ? {} : get_installed();
-$repository = get_index($url.'00INDEX.rdf',$opt_f,\%with,$opt_X);
+$repository = get_index(
+ $url.'00INDEX.rdf',
+ $opt_f,
+ ($opt_W ? undef : \%with),
+ $opt_X);
$env = {
config => $config,
@@ -1831,23 +1878,28 @@
scalar(%with) > 0 )
};
-($list,$bonly,$clist) = build_list($pattern, $env);
-die "FATAL: cannot find package\n" unless defined $list;
-
-if ($opt_M) {
- print_map($installed,$repository,$list,$bonly,$clist);
-} elsif ($opt_S) {
- print_status($installed,$repository,$list,$bonly,$clist);
-} elsif ($opt_s) {
- print_status($installed,{},$list,$bonly,$clist);
+if ($opt_L) {
+ ($list) = build_deps($pattern, $env);
+ print_deps($list);
} else {
- if (@{$env->{fatal}}) {
- die "FATAL errors occured while building:\n",
- join (',', @{$env->{fatal}}),
- "\n";
- }
+ ($list,$bonly,$clist) = build_list($pattern, $env);
+ die "FATAL: cannot find package\n" unless defined $list;
- print_list1($list,$config,$opt_a || $opt_u || $opt_U,\%with,$opt_i);
- print_list2($bonly,$config);
+ if ($opt_M) {
+ print_map($installed,$repository,$list,$bonly,$clist);
+ } elsif ($opt_S) {
+ print_status($installed,$repository,$list,$bonly,$clist);
+ } elsif ($opt_s) {
+ print_status($installed,{},$list,$bonly,$clist);
+ } else {
+ if (@{$env->{fatal}}) {
+ die "FATAL errors occured while building:\n",
+ join (',', @{$env->{fatal}}),
+ "\n";
+ }
+
+ print_list1($list,$config,$opt_a || $opt_u || $opt_U,\%with,$opt_i);
+ print_list2($bonly,$config);
+ }
}
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-tool/openpkg-tool.spec
============================================================================
$ cvs diff -u -r1.24 -r1.25 openpkg-tool.spec
--- openpkg-src/openpkg-tool/openpkg-tool.spec 14 Jan 2003 15:48:17 -0000
1.24
+++ openpkg-src/openpkg-tool/openpkg-tool.spec 15 Jan 2003 12:15:46 -0000
1.25
@@ -32,8 +32,8 @@
Distribution: OpenPKG [PLUS]
Group: Bootstrapping
License: GPL
-Version: 20030114
-Release: 20030114
+Version: 20030115
+Release: 20030115
# list of sources
Source0: openpkg.sh
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-tool/openpkg.pod
============================================================================
$ cvs diff -u -r1.9 -r1.10 openpkg.pod
--- openpkg-src/openpkg-tool/openpkg.pod 13 Jan 2003 16:35:08 -0000 1.9
+++ openpkg-src/openpkg-tool/openpkg.pod 15 Jan 2003 12:15:46 -0000 1.10
@@ -60,6 +60,8 @@
[B<-s>]
[B<-S>]
[B<-M>]
+[B<-L>]
+[B<-W>]
[B<-X>]
[B<-P> I<priv-cmd>]
[B<-N> I<non-priv-cmd>]
@@ -254,6 +256,19 @@
=item B<-M>
Similar to B<-s> but print a short dependency map.
+
+=item B<-L>
+
+Print a list of packages in the repository that depend on the target.
+
+=item B<-W>
+
+Include all conditional dependencies as if all possible configuration
+options had been switched on. This has little use except for generating
+an all-inclusive list with the B<-L> option.
+I<ATTENTION: Even mutually exclusive options are evaluated to be 'on',
+building packages with B<-W> therefore might fail or cause unusuable
+results!>
=item B<-X>
@@ .
patch -p0 <<'@@ .'
Index: openpkg-web/news.txt
============================================================================
$ cvs diff -u -r1.2811 -r1.2812 news.txt
--- openpkg-web/news.txt 15 Jan 2003 11:09:40 -0000 1.2811
+++ openpkg-web/news.txt 15 Jan 2003 12:15:44 -0000 1.2812
@@ -1,3 +1,4 @@
+15-Jan-2003: Upgraded package: P<openpkg-tool-20030115-20030115>
15-Jan-2003: Upgraded package: P<automake-1.7.2-20030115>
15-Jan-2003: Upgraded package: P<shiela-1.0.4-20030115>
15-Jan-2003: Upgraded package: P<grepmail-4.91-20030115>
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]