diff options
-rw-r--r-- | pkgtools/pkgdepgraph/Makefile | 4 | ||||
-rw-r--r-- | pkgtools/pkgdepgraph/files/pkgdepgraph.1 | 31 | ||||
-rwxr-xr-x | pkgtools/pkgdepgraph/files/pkgdepgraph.pl | 186 |
3 files changed, 142 insertions, 79 deletions
diff --git a/pkgtools/pkgdepgraph/Makefile b/pkgtools/pkgdepgraph/Makefile index b3853433c6b..93e44292525 100644 --- a/pkgtools/pkgdepgraph/Makefile +++ b/pkgtools/pkgdepgraph/Makefile @@ -1,7 +1,7 @@ -# $NetBSD: Makefile,v 1.6 2003/03/10 22:31:20 atatat Exp $ +# $NetBSD: Makefile,v 1.7 2003/03/14 23:39:54 atatat Exp $ # -DISTNAME= pkgdepgraph-2.1 +DISTNAME= pkgdepgraph-2.2 CATEGORIES= pkgtools devel MASTER_SITES= # empty DISTFILES= # empty diff --git a/pkgtools/pkgdepgraph/files/pkgdepgraph.1 b/pkgtools/pkgdepgraph/files/pkgdepgraph.1 index 5d54255a9bb..3e2d04efa83 100644 --- a/pkgtools/pkgdepgraph/files/pkgdepgraph.1 +++ b/pkgtools/pkgdepgraph/files/pkgdepgraph.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: pkgdepgraph.1,v 1.4 2003/03/06 21:13:13 atatat Exp $ +.\" $NetBSD: pkgdepgraph.1,v 1.5 2003/03/14 23:39:56 atatat Exp $ .\" .\" Copyright (c) 2002, 2003 by Andrew Brown <atatat@netbsd.org> .\" Absolutely no warranty. @@ -10,8 +10,9 @@ .Nd visual representation of installed packages .Sh SYNOPSIS .Nm -.Op Fl CcDfgLloRv +.Op Fl ACcDfgLloRv .Op Fl d Ar pkg_dbdir +.Op Fl K Ar packages .Op Fl O Ar package .Op Fl P Ar pkgsrcdir .Op Fl t Ar target @@ -80,6 +81,13 @@ package. .Pp The options are as follows: .Bl -tag -width package +.It Fl A +This option modifies the output of +.Fl R +to use +.Xr pkg_add 1 +to reinstall deleted packages, instead of building directly from the +pkgsrc tree. .It Fl C Asserts .Fl c @@ -126,6 +134,15 @@ or .Dq gimp ) in a subgraph with a line around it so you can visually associate packages. +.It Fl K Ar packages +The base location or url from which to install binary packages. +This defaults to the value of PKG_PATH, or to PACKAGES with +.Pf \\*q Dv /All Ns \\*q +added to the end, or to the value determined for pkgsrcdir (see the +.Fl P +option) with +.Pf \\*q Dv /packages/All Ns \\*q +appended to it. .It Fl L Limit the graph to those packages that are out of date or ultimately depend on some package that is. @@ -202,6 +219,14 @@ Where to find registered packages instead of .Ss PKGSRCDIR Where the pkgsrc tree is located instead of .Pa @PKGSRCDIR@ . +.Ss PKG_PATH +.Ss PACKAGES +Two variables that can be used as a location for binary packages. +See the +.Fl A +and +.Fl K +options for more details. .Sh EXAMPLES The default output: .Bd -literal -offset indent @@ -213,7 +238,7 @@ of it: .Bd -literal -offset indent $ lintpkgsrc -i \*[Gt] pkgdepgraph.in $ audit-packages \*[Gt]\*[Gt] pkgdepgraph.in -$ pkgdepgraph -clv pkgdepgraph.in \*[Gt] pkgdepgraph.dot +$ pkgdepgraph -lv pkgdepgraph.in \*[Gt] pkgdepgraph.dot $ dot -Tps pkgdepgraph.dot \*[Gt] pkgdepgraph.ps .Ed .Pp diff --git a/pkgtools/pkgdepgraph/files/pkgdepgraph.pl b/pkgtools/pkgdepgraph/files/pkgdepgraph.pl index b8f4b168539..81c911d94eb 100755 --- a/pkgtools/pkgdepgraph/files/pkgdepgraph.pl +++ b/pkgtools/pkgdepgraph/files/pkgdepgraph.pl @@ -3,38 +3,54 @@ # Copyright (c) 2002, 2003 by Andrew Brown <atatat@netbsd.org> # Absolutely no warranty. -# $NetBSD: pkgdepgraph.pl,v 1.4 2003/03/10 22:31:20 atatat Exp $ +# $NetBSD: pkgdepgraph.pl,v 1.5 2003/03/14 23:39:56 atatat Exp $ # pkgdepgraph: @DISTVER@ use strict; -use Getopt::Std; -my($opts, %opt) = ('CcDd:fgLlO:oP:Rt:vU:'); +use Getopt::Long; +Getopt::Long::Configure("bundling"); +my(@opts, %opt); my($iam, $version, $usecolor, $group, $locations, $order, $versions); -my($limit, $delete, $rebuild, $force, $outofdate, $update, $clean); -my($pkg_dbdir, $pkgsrcdir); +my($limit, $delete, $rebuild, $force, @outofdate, @update, $clean); +my($pkg_dbdir, $pkgsrcdir, $packages, $pkgadd); +$version = '@DISTVER@'; ($iam = $0) =~ s:.*/::; -die("usage: $iam [-CcDfgLloRv] [-d pkg_dbdir] [-O package] [-P pkgsrcdir]\n", - " " x (length($iam) + 8), "[-t target] [-U package] [data ...]\n") - if (!getopts($opts, \%opt)); - -$version = "@DISTVER@"; -$usecolor = 0; -$pkg_dbdir = $opt{d} || $ENV{'PKG_DBDIR'} || "/var/db/pkg"; -$pkgsrcdir = $opt{P} || $ENV{'PKGSRCDIR'} || "/usr/pkgsrc"; -$group = $opt{g}; -$locations = $opt{l}; -$order = $opt{o}; -$versions = $opt{v}; -$delete = $opt{D}; -$rebuild = $opt{t} || "install" if (defined($opt{R})); -$force = $opt{f}; -$outofdate = $opt{O}; -$update = $opt{U}; -$limit = $opt{L}; -$clean = $opt{c} ? "clean" : ""; -$clean = $opt{C} ? "CLEANDEPENDS=YES clean" : $clean; +@opts = ('A', 'C', 'c', 'D', 'd=s', 'f', 'g', 'K=s', 'L', 'l', 'O=s', + 'o', 'P=s', 'R', 't=s', 'U=s', 'v'); +%opt = ( + 'A' => \$pkgadd, + # 'C' => implies "realclean", handled later + # 'c' => implies "clean", handled later + 'D' => \$delete, + 'd' => \$pkg_dbdir, + 'f' => \$force, + 'g' => \$group, + 'K' => \$packages, + 'L' => \$limit, + 'l' => \$locations, + 'O' => \@outofdate, + 'o' => \$order, + 'P' => \$pkgsrcdir, + 'R' => \$rebuild, + # 't' => goes to rebuild, handled later + 'U' => \@update, + 'v' => \$versions, + ); +die("usage: $iam [-ACcDfgLloRv] [-d pkg_dbdir] [-K packages] [-O package]\n", + " " x (length($iam) + 8), + "[-P pkgsrcdir] [-t target] [-U package] [data ...]\n") + if (!GetOptions(\%opt, @opts)); + +$pkg_dbdir ||= $ENV{'PKG_DBDIR'} || "/var/db/pkg"; +$pkgsrcdir ||= $ENV{'PKGSRCDIR'} || "/usr/pkgsrc"; +$packages = $ENV{'PKG_PATH'} if (!$packages); +$packages = $ENV{'PACKAGES'} . "/All" if (!$packages && $ENV{'PACKAGES'}); +$packages = $pkgsrcdir . "/packages/All" if (!$packages); +$rebuild &&= $opt{t} || "install"; +$clean = "clean" if ($opt{c}); +$clean = "CLEANDEPENDS=YES clean" if ($opt{C}); my(@pkgs, $pkg, $req, %req, @reqs, @rreqs); my(%clusters, $cluster); @@ -231,15 +247,15 @@ foreach $pkg (sort(byord @pkgs)) { ## if we want to check a specific pkg for rebuild impact, mark it as ## "forced" to be out of date, unless it already *is* out of date. ## -## XXX: i wish getopts could stuff successive -O values into an array -## -if ($outofdate) { +if (@outofdate) { $usecolor = 1; - $outofdate = canonicalize($outofdate); + canonicalize(@outofdate); - if ($color{$outofdate} ne "red") { - $color{$outofdate} = "red"; - $need{$outofdate} = "$outofdate (forced)"; + foreach (@outofdate) { + if ($color{$_} ne "red") { + $color{$_} = "red"; + $need{$_} = "$_ (forced)"; + } } } @@ -250,31 +266,32 @@ if ($outofdate) { ## $force is set, mark *all* dependencies of the given pkg as out of ## date. ## -## XXX: i wish getopts could stuff successive -U values into an array -## -if ($update) { - $update = canonicalize($update); +if (@update) { + my(@leftover); - # these things are directly related - @reqs = sort(keys %{$req{$update}}); - @rreqs = recurse(@reqs); + canonicalize(@update); + @update = uniq(sort(@update, recurse(@update))); - # check each pkg to see if it will be affected - foreach $pkg (@pkgs) { - # these pkgs are dependencies - if (grep($pkg eq $_, ($update, @reqs, @rreqs))) { - if ($force && $color{$pkg} ne "red") { - # we want to force rebuild of *all* dependencies - $color{$pkg} = "red"; - $need{$pkg} = "$pkg (forced)"; + if ($force) { + foreach (@update) { + if ($color{$_} ne "red") { + $color{$_} = "red"; + $need{$_} = "$_ (forced)"; } } - # these packages do not depend on any of $update's dependencies + } + + foreach (sort(@pkgs)) { + if ($_ eq $update[0]) { + shift(@update); + } else { - delete($color{$pkg}); - delete($need{$pkg}); + push(@leftover, $_); } } + + delete(@color{@leftover}); + delete(@need{@leftover}); } ## @@ -289,16 +306,18 @@ if ($delete) { ## ## "rebuild" output for sh(1), with just leaves listed. all the ## dependencies will be built "automagically" by the regular build -## mechanism. +## mechanism. if $add is set, emit commands for installing binary +## pkgs instead. ## if ($rebuild) { - map(printf("( pkg_info -qe %s || " . - "( cd %s/%s && " . - "make %s%s )) &&\n", - ($need{$_} || $_) =~ /(.*)-.*/, - $pkgsrcdir, $where{$_}, - $rebuild, - $clean ? " && make $clean" : ""), + printf("PKG_PATH=\"$packages\"\nexport PKG_PATH\n") if ($pkgadd); + + map($pkgadd ? + printf("( pkg_info -qe %s || pkg_add %s.tgz ) &&\n", + /(.*)-.*/, ($need{$_} || $_)) : + printf("( pkg_info -qe %s || ( cd %s && make %s%s )) &&\n", + /(.*)-.*/, "$pkgsrcdir/$where{$_}", + $rebuild, $clean ? " && make $clean" : ""), grep(color($_) ne "green" && $ord{$_} == 1, @pkgs)); print("true\n"); exit(0); @@ -367,33 +386,36 @@ print("}\n"); ## find all dependencies below a given node ## sub recurse { - my($pkg, @list, %list); - %list = @list = (); - foreach $pkg (@_) { - @list = keys %{$req{$pkg}}; - map($list{$_} = $_, @list, recurse(@list)); + my(@list, @new); + @list = (); + foreach (@_) { + @new = keys %{$req{$_}}; + push(@list, @new, recurse(@new)); } - sort(keys %list); + uniq(sort(@list)); } ## ## canonicalize a pkg name based on what we have installed ## sub canonicalize { - my($canon); - my($pkg) = @_; + my($canon, $pkg); - # attempt to find actual pkg, first by argument given... - ($canon) = grep($pkg eq $_, @pkgs); + foreach $pkg (@_) { + # attempt to find actual pkg, first by argument given... + ($canon) = grep($pkg eq $_, @pkgs); + + # ...then by comparing against the internal list sans version numbers + ($canon) = grep(($a = $_) =~ s/(.*)-.*/$1/ && $pkg eq $a, @pkgs) + if (!defined($canon)); - # ...then by comparing against the internal list sans version numbers - ($canon) = grep(($a = $_) =~ s/(.*)-.*/$1/ && $pkg eq $a, @pkgs) - if (!defined($canon)); + die("package '$pkg' not found\n") + if (!defined($canon)); - die("package '$pkg' not found\n") - if (!defined($canon)); + $pkg = $canon; + } - $canon; + @_; } ## @@ -460,3 +482,19 @@ sub order { order($n + 1, sort(keys %{$req{$pkg}})); } } + +## +## uniq - eliminate adjacent duplicate entries in an array +## +sub uniq { + my($i); + for ($i = 0; $i < $#_; ) { + if ($_[$i] eq $_[$i + 1]) { + splice(@_, $i, 1); + } + else { + $i++; + } + } + @_; +} |