summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkgtools/pkgdepgraph/Makefile4
-rw-r--r--pkgtools/pkgdepgraph/files/pkgdepgraph.131
-rwxr-xr-xpkgtools/pkgdepgraph/files/pkgdepgraph.pl186
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++;
+ }
+ }
+ @_;
+}