diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2001-06-09 15:50:05 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2001-06-09 15:50:05 +0000 |
commit | a59d310d9d6fc6b5004dff1685222dafb18c21bd (patch) | |
tree | 71d3c3e1808ec4692ba7149f3916463839ea163b /ports-mgmt | |
parent | 6dfa12c8055e3451a994a397f4213b7be0051658 (diff) | |
download | ports-a59d310d9d6fc6b5004dff1685222dafb18c21bd.tar.gz ports-a59d310d9d6fc6b5004dff1685222dafb18c21bd.zip |
Add experimental pkg_version(8)-like functionality.
Notes
Notes:
svn path=/head/; revision=43710
Diffstat (limited to 'ports-mgmt')
-rw-r--r-- | ports-mgmt/porteasy/Makefile | 3 | ||||
-rw-r--r-- | ports-mgmt/porteasy/src/porteasy.8 | 24 | ||||
-rw-r--r-- | ports-mgmt/porteasy/src/porteasy.pl | 156 |
3 files changed, 124 insertions, 59 deletions
diff --git a/ports-mgmt/porteasy/Makefile b/ports-mgmt/porteasy/Makefile index 811b167a117d..2f06659c55c4 100644 --- a/ports-mgmt/porteasy/Makefile +++ b/ports-mgmt/porteasy/Makefile @@ -8,8 +8,7 @@ # PORTNAME= porteasy -PORTVERSION= 2.3 -PORTREVISION= 2 +PORTVERSION= 2.4 CATEGORIES= misc MASTER_SITES= # none DISTFILES= # none diff --git a/ports-mgmt/porteasy/src/porteasy.8 b/ports-mgmt/porteasy/src/porteasy.8 index 2442454b43fa..df99dfe6ab62 100644 --- a/ports-mgmt/porteasy/src/porteasy.8 +++ b/ports-mgmt/porteasy/src/porteasy.8 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 19, 2000 +.Dd June 9, 2001 .Dt PORTEASY 8 .Os .Sh NAME @@ -35,7 +35,7 @@ .Nd fetch and build ports .Sh SYNOPSIS .Nm porteasy -.Op Fl abCceFfhikLluVvw +.Op Fl abCceFfhIikLlsuVvw .Op Fl D Ar date .Op Fl d Ar dir .Op Fl p Ar dir @@ -73,6 +73,8 @@ installed. Fetch the selected ports. .It Fl h Show a summary of options and parameters. +.It Fl I +Select installed ports. .It Fl i Describe the selected ports. .It Fl k @@ -86,6 +88,8 @@ Specify the ports directory (normally .Pa /usr/ports ) . .It Fl r Ar dir Specify the CVS root directory. +.It Fl s +List installed ports and their status. .It Fl t Ar tag Specify a tag to use for .Xr cvs 1 @@ -128,7 +132,10 @@ the command line, the index file is updated using .Xr cvs 1 . .It Select ports The selection list is initialized with the ports listed on the command -line, marked as explicit dependencies. +line (and, if the +.Fl I +option was specified, all installed ports) marked as explicit +dependencies. Any unqualified names are looked up in the index, using simple heuristics to identify incompletely named ports. If a certain match is not found, @@ -162,6 +169,12 @@ If the option was specified, the fully qualified name and package name of all selected ports are listed. Explicitly selected ports are indicated with a star. +.It List installed ports +If the +.Fl s +option was specified, all installed ports are listed with their status +('<' for ports that are older than the version in the tree, '>' for +those that are newer, '?' for those that could not be identified). .It Show packing lists If the .Fk L @@ -174,11 +187,6 @@ option was specified, .Nm prints a description of each port that was specified on the command line. -If no ports were specified, -.Nm -instead prints a list of all installed ports, with unknown ports (i.e. -ports that are not in the index file, or are out of date) indicated -with a question mark. .It Show the URLs of the selected ports' web sites If the .Fl w diff --git a/ports-mgmt/porteasy/src/porteasy.pl b/ports-mgmt/porteasy/src/porteasy.pl index b9ced56be732..230ab2e31e67 100644 --- a/ports-mgmt/porteasy/src/porteasy.pl +++ b/ports-mgmt/porteasy/src/porteasy.pl @@ -33,7 +33,7 @@ use strict; use Fcntl; use Getopt::Long; -my $VERSION = "2.3"; +my $VERSION = "2.4"; my $COPYRIGHT = "Copyright (c) 2000 Dag-Erling Smørgrav. All rights reserved."; # Constants @@ -62,22 +62,26 @@ my $cvsroot = 0; # CVS root directory my $exclude = 0; # Do not list installed ports my $fetch = 0; # Fetch ports my $force = 0; # Force package registration +my $installed = 0; # Select installed ports my $info = 0; # Show port info my $dontclean = 0; # Don't clean after build my $packages = 0; # Build packages my $list = 0; # List ports my $plist = 0; # Print packing list my $build = 0; # Build ports +my $status = 0; # List installed ports and their status my $update = 0; # Update ports tree from CVS my $verbose = 0; # Verbose mode my $website = 0; # Show website URL # Global variables +my $have_index; # Index has been read my %ports; # Maps ports to their directory. my %pkgname; # Inverse of the above map my %masterport; # Maps ports to their master ports my %reqd; # Ports that need to be installed -my %installed; # Ports that are already installed +my %have_dep; # Dependencies that are already present +my %installed; # Installed ports my $suppressed; # Suppress output # @@ -322,6 +326,7 @@ sub read_index() { local *INDEX; # File handle my $line; # Line from file + return if ($have_index); info("Reading index file"); sysopen(INDEX, $index, O_RDONLY) or bsd::err(1, "can't open $index"); @@ -335,6 +340,7 @@ sub read_index() { } close(INDEX); info(keys(%ports) . " ports in index"); + $have_index = 1; } # @@ -370,6 +376,9 @@ sub add_port($$) { if ($port =~ m|^([^/]+/[^/]+)$|) { $realport = $1; } else { + if (!$have_index) { + read_index(); + } if (exists($ports{$port})) { $realport = $ports{$port}; } else { @@ -387,6 +396,60 @@ sub add_port($$) { } # +# Get the ORIGIN line from a manifest +# +sub get_origin($) { + my $port = shift; # Port to inspect + + local *FILE; # File handle + my $origin; # Origin + + if (!sysopen(FILE, "$dbdir/$port/+CONTENTS", O_RDONLY)) { + bsd::warn("can't read manifest for $port"); + return undef; + } + while (<FILE>) { + if (m/^\@comment\s+ORIGIN:(.*)\s*$/) { + $origin = $1; + last; + } + } + close(FILE); + if ($origin) { + info("$port -> $origin\n"); + } + return $origin; +} + +# +# Select installed ports +# +sub add_installed() { + + local *DIR; # Directory handle + my $port; # Installed port + my $origin; # Port's origin + + opendir(DIR, $dbdir) + or bsd::err(1, "can't read database directory"); + foreach $port (readdir(DIR)) { + next if ($port eq "." || $port eq ".." || ! -d "$dbdir/$port"); + if (!defined($origin = get_origin($port))) { + if (!$have_index) { + read_index(); + } + if (!defined($origin = $ports{$port})) { + bsd::warnx("installed port %s is unknown", $port); + } + } + if (defined($installed{$port} = $origin)) { + add_port($origin, &REQ_EXPLICIT); + } + } + closedir(DIR); +} + +# # Find master directory for a port # sub find_master($) { @@ -492,7 +555,7 @@ sub find_dependencies($) { } ($lhs, $rhs) = ($1, $2); if ($exclude) { - if ($installed{$rhs}) { + if ($have_dep{$rhs}) { next; } info("Verifying status of $rhs ($lhs)"); @@ -500,10 +563,10 @@ sub find_dependencies($) { ($lhs =~ m/\.\d+$/ && find_library($lhs)) || find_binary($lhs)) { info("$rhs seems to be installed"); - $installed{$rhs} = 1; + $have_dep{$rhs} = 1; next; } - $installed{$rhs} = -1; + $have_dep{$rhs} = -1; } info("Adding $rhs as a dependency for $port"); $depends{$rhs} = 1; @@ -719,25 +782,21 @@ sub show_port_plist($) { # sub list_installed() { - local *DIR; # Directory handle - my $port; # Port name - my $unknown; # Unknown ports + my $port; # Port + my $origin; # Origin - opendir(DIR, $dbdir) - or bsd::err(1, "can't read database directory"); - print("Installed ports:\n"); - foreach $port (readdir(DIR)) { - next if ($port eq "." || $port eq ".." || ! -d "$dbdir/$port"); - if (exists($ports{$port})) { - print(" $port\n"); - } else { + foreach $port (sort(keys(%installed))) { + $origin = $installed{$port}; + if (!defined($origin) || !defined($pkgname{$origin})) { print(" ? $port\n"); - ++$unknown; + } elsif ($port lt $pkgname{$origin}) { + print(" < $port ($pkgname{$origin})\n"); + } elsif ($port gt $pkgname{$origin}) { + print(" > $port ($pkgname{$origin})\n"); + } else { + print(" $port\n"); } } - if ($unknown) { - print("Recommend you run pkg_version(1).\n"); - } } # @@ -805,7 +864,7 @@ sub build_port($) { # sub usage() { - stderr("Usage: porteasy [-abCceFfhikLluVvw] [-D date] [-d dir]\n" . + stderr("Usage: porteasy [-abCceFfhIikLlsuVvw] [-D date] [-d dir]\n" . " [-p dir] [-r dir] [-t tag] [port ...]\n"); exit(1); } @@ -838,10 +897,12 @@ Options: -F, --force-pkg-register Force package registration -f, --fetch Fetch distfiles -h, --help Show this information + -I, --installed Select installed ports -i, --info Show info about specified ports -k, --packages Build packages for the specified ports -L, --plist Show the packing lists for the specified ports -l, --list List required ports and their dependencies + -s, --status List installed ports and their status -u, --update Update relevant portions of the ports tree -V, --version Show version number -v, --verbose Verbose mode @@ -862,7 +923,6 @@ Report bugs to <des\@freebsd.org>. MAIN:{ my $port; # Port name my $err = 0; # Error count - my $need_index; # Need the index # Show usage if no arguments were specified on the command line if (!@ARGV) { @@ -889,12 +949,14 @@ MAIN:{ "F|force-pkg-register" => \$force, "f|fetch" => \$fetch, "h|help" => \&help, + "I|installed" => \$installed, "i|info" => \$info, "k|packages" => \$packages, "L|plist" => \$plist, "l|list" => \$list, "p|portsdir=s" => \$portsdir, "r|cvsroot=s" => \$cvsroot, + "s|status" => \$status, "t|tag=s" => \$tag, "u|update" => \$update, "V|version" => \&version, @@ -924,6 +986,11 @@ MAIN:{ if ($packages) { $build = 1; } + + # 'status' implies 'installed' + if ($status) { + $installed = 1; + } # Set and check CVS root if ($anoncvs && !$cvsroot) { @@ -939,21 +1006,8 @@ MAIN:{ bsd::errx(1, "No CVS root, please use the -r option or set \$CVSROOT"); } - # Check if we need the index - if (!@ARGV && $info) { - $need_index = 1; - } - foreach $port (@ARGV) { - if ($port !~ m/\//) { - $need_index = 1; - } - } - - # Step 1: read the ports index + # Step 1: update the ports index update_index(); - if ($need_index) { - read_index(); - } # Step 2: build list of explicitly required ports foreach $port (@ARGV) { @@ -962,6 +1016,9 @@ MAIN:{ if ($err) { bsd::errx(1, "some required ports were not found."); } + if ($installed) { + add_installed(); + } # Step 3: update port directories and discover dependencies update_ports_tree(keys(%reqd)); @@ -986,20 +1043,21 @@ MAIN:{ } } - # Step 6: show info (or list installed packages) + # Step 6: list installed ports + if ($status) { + list_installed(); + } + + # Step 7: show info if ($info) { - if (!@ARGV) { - list_installed(); - } else { - foreach $port (keys(%reqd)) { - if ($reqd{$port} & &REQ_EXPLICIT) { - show_port_info($port); - } + foreach $port (keys(%reqd)) { + if ($reqd{$port} & &REQ_EXPLICIT) { + show_port_info($port); } } } - # Step 7: show packing list + # Step 8: show packing list if ($plist) { foreach $port (keys(%reqd)) { if ($reqd{$port} & &REQ_EXPLICIT) { @@ -1008,7 +1066,7 @@ MAIN:{ } } - # Step 8: show website URL + # Step 9: show website URL if ($website) { foreach $port (keys(%reqd)) { if ($reqd{$port} & &REQ_EXPLICIT) { @@ -1017,7 +1075,7 @@ MAIN:{ } } - # Step 9: clean the ports directories (or the entire tree) + # Step A: clean the ports directories (or the entire tree) if ($clean) { if (!@ARGV) { clean_tree(); @@ -1030,7 +1088,7 @@ MAIN:{ } } - # Step A: fetch distfiles + # Step B: fetch distfiles if ($fetch) { foreach $port (keys(%reqd)) { if ($reqd{$port} != &REQ_MASTER) { @@ -1039,7 +1097,7 @@ MAIN:{ } } - # Step B: build ports - only the explicitly required ones, since + # Step C: build ports - only the explicitly required ones, since # some dependencies (most commonly XFree86) may be bogus. if ($build || $packages) { foreach $port (keys(%reqd)) { |