diff options
Diffstat (limited to 'ports-mgmt/porteasy')
-rw-r--r-- | ports-mgmt/porteasy/Makefile | 33 | ||||
-rw-r--r-- | ports-mgmt/porteasy/pkg-comment | 1 | ||||
-rw-r--r-- | ports-mgmt/porteasy/pkg-descr | 22 | ||||
-rw-r--r-- | ports-mgmt/porteasy/pkg-plist | 1 | ||||
-rw-r--r-- | ports-mgmt/porteasy/src/porteasy.8 | 265 | ||||
-rw-r--r-- | ports-mgmt/porteasy/src/porteasy.pl | 999 |
6 files changed, 0 insertions, 1321 deletions
diff --git a/ports-mgmt/porteasy/Makefile b/ports-mgmt/porteasy/Makefile deleted file mode 100644 index 6595cfaa2665..000000000000 --- a/ports-mgmt/porteasy/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -# New ports collection makefile for: porteasy -# Date created: September 19th 2000 -# Whom: des -# -# $FreeBSD$ -# -# This port is self contained in the src directory. -# - -PORTNAME= porteasy -PORTVERSION= 2.2 -CATEGORIES= misc -MASTER_SITES= # none -DISTFILES= # none - -MAINTAINER= des@FreeBSD.org - -NO_BUILD= yes -NO_WRKSUBDIR= yes -USE_PERL5= yes - -SRC= ${.CURDIR}/src - -MAN8= porteasy.8 - -do-fetch: - @${DO_NADA} - -do-install: - @${INSTALL_SCRIPT} ${SRC}/porteasy.pl ${PREFIX}/bin/porteasy - @${INSTALL_MAN} ${SRC}/porteasy.8 ${PREFIX}/man/man8 - -.include <bsd.port.mk> diff --git a/ports-mgmt/porteasy/pkg-comment b/ports-mgmt/porteasy/pkg-comment deleted file mode 100644 index b0b24b7f52b0..000000000000 --- a/ports-mgmt/porteasy/pkg-comment +++ /dev/null @@ -1 +0,0 @@ -A tool for fetching and building ports diff --git a/ports-mgmt/porteasy/pkg-descr b/ports-mgmt/porteasy/pkg-descr deleted file mode 100644 index 2a2391f38f59..000000000000 --- a/ports-mgmt/porteasy/pkg-descr +++ /dev/null @@ -1,22 +0,0 @@ -Porteasy lets you install ports and build packages without maintaining -a full ports tree. It achieves this by scanning the ports index for -dependency information, and using CVS to update only the ports you -requested and their dependencies. - -Here are some of the things porteasy does for you: - - - automatically update the necessary files (and only the necessary - files) using CVS (including anoncvs support) - - - list all of a port's dependencies, optionally hiding those that - are already installed - - - fetch all the necessary distfiles right away, in a single batch, - so you don't have to wait for one dependency to build before - fetching the next one's distfile. Dialup users will love this. - - - build and install arbitrary ports. - - - build packages. - - -- des@freebsd.org diff --git a/ports-mgmt/porteasy/pkg-plist b/ports-mgmt/porteasy/pkg-plist deleted file mode 100644 index 6b52c1b30876..000000000000 --- a/ports-mgmt/porteasy/pkg-plist +++ /dev/null @@ -1 +0,0 @@ -bin/porteasy diff --git a/ports-mgmt/porteasy/src/porteasy.8 b/ports-mgmt/porteasy/src/porteasy.8 deleted file mode 100644 index ad5a504e9c0d..000000000000 --- a/ports-mgmt/porteasy/src/porteasy.8 +++ /dev/null @@ -1,265 +0,0 @@ -.\"- -.\" Copyright (c) 2000 Dag-Erling Coïdan Smørgrav -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer -.\" in this position and unchanged. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd September 19, 2000 -.Dt PORTEASY 8 -.Os -.Sh NAME -.Nm porteasy -.Nd fetch and build ports -.Sh SYNOPSIS -.Nm porteasy -.Op Fl abCceFfhikLluVv -.Op Fl D Ar date -.Op Fl d Ar dir -.Op Fl p Ar dir -.Op Fl r Ar dir -.Op Fl t Ar tag -.Op Ar port ... -.Sh DESCRIPTION -.Nm -maintains an updated ports tree, and fetches and builds ports -automatically, keeping track of dependencies. -.Pp -The following options are available: -.Bl -tag -width Fl -.It Fl a -Use the FreeBSD project's anoncvs server as CVS root directory. -.It Fl b -Build the selected ports. -.It Fl C -Don't clean port directories after building. -.It Fl c -Clean the selected ports. -.It Fl D Ar date -Specify a date to use for -.Xr cvs 1 -operations. -.It Fl d Ar dir -Specify the package database directory (normally -.Pa /var/db/pkg ) . -.It Fl e -Deselect ports that are already installed. -.It Fl F -Force installation and registration, even if the port is already -installed. -.It Fl f -Fetch the selected ports. -.It Fl h -Show a summary of options and parameters. -.It Fl i -Describe the selected ports. -.It Fl k -Build packages for the selected ports. -.It Fl L -List the packing lists for the selected ports. -.It Fl l -List the selected ports. -.It Fl p Ar dir -Specify the ports directory (normally -.Pa /usr/ports ) . -.It Fl r Ar dir -Specify the CVS root directory. -.It Fl t Ar tag -Specify a tag to use for -.Xr cvs 1 -operations. -.It Fl u -Update all necessary files using -.Xr cvs 1 . -.It Fl V -Show the -.Nm -version number and exit. -.It Fl v -Verbose mode: show more information about what is being done. -.El -.Pp -If no options are specified, the default is to build the specified -ports. -.Ss Port names -The port names listed on the command line may be either unqualified or -fully qualified. -A fully qualified port name is the path to the port directory relative -to the root of the ports tree (i.e. the port's category and name -separated by a slash). -An unqualified port name is the name of the package built by the -intended port, or part of that name. -.Pp -Unqualified names need to be looked up in the ports index, which is -usually slightly out of date, so fully qualified names should be used -whenever possible. -.Ss Sequence of operation -This section describes the operations performed by -.Nm -and the order in which they are performed. -.Bl -tag -width indent -.It Update index -If the -.Fl u -option was specified and some unqualified port names were listed on -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. -Any unqualified names are looked up in the index, using simple -heuristics to identify incompletely named ports. -If a certain match is not found, -.Nm -prints a list of possible matches and exits. -.Pp -All direct and indirect dependencies of the ports listed on the -command line are also selected and marked as dependencies. -.It Update ports tree and discover dependencies -If the -.Fl u -option was specified, the port directories for all selected ports are -updated using -.Xr cvs 1 . -Each selected port's Makefile is scanned to discover dependencies, -which are in turn selected and marked as implicit dependencies. -This process is repeated until no new dependencies are found. -.It Deselect installed ports -.Pp -If the -.Fl e -option was specified, -.Nm -checks to see if any of the selected ports are already installed; -those that are are deselected. -This process is not very accurate, as it will not detect if an older -or alternate version of a selected port is installed. -.It List selected ports -If the -.Fl l -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 Show packing lists -If the -.Fk L -option was specified, the packing lists for all explicitly selected -ports are shown. -.It Describe selected ports -If the -.Fl i -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 Clean the tree -If the -.Fl c -option was specified, -.Nm -runs the -.Sq clean -target on every selected port. -If no ports were selected, -.Nm -runs the -.Sq clean -target on every known port that is present in the tree. -.It Fetch ports -If at least one of the -.Fl b , -.Fl f -or -.Fl k -options was specified, -.Nm -runs the -.Sq fetch -target on every selected port. -.It Build, install, package, clean ports -If one or both of the -.Fl f -or -.Fl k -options were specified, -.Nm -runs the -.Sq install -or -.Sq package -target, followed by the -.Sq clean -target (unless the -.Fl C -option was specified), on every explicitly selected port. -.Nm -lets the ports system handle dependencies on its own, since the -reported dependencies are sometimes too inclusive. -.El -.Sh IMPLEMENTATION NOTES -There may be a significant difference between what ports are selected -(and listed if the -.Fl l -option is specified) and what ports are actually installed and/or have -packages built for them, since implicitly selected ports that are -already installed, or somehow pass the dependency check (e.g. because -an alternate, equivalent port has been installed) will be passed over -by the ports system, as indeed they should. -.Pp -.Nm -tries to minimize the number of times -.Xr cvs 1 -is invoked, since the overhead involved in connecting to a remote -server is usually quite high (and the user might have to type a -password every time), but prefers correctness to performance. -The maximum number of invocations is (2 + NC + NP), where NC and NP -are the number of distinct categories and ports (including master -directories and dependencies). -.Sh ENVIRONMENT -.Bl -tag -width PORTEASY_OPTIONS -.It Ev PORTEASY_OPTIONS -Specifies a set of default options for -.Nm . -These options can be overridden by command line parameters. -.El -.Sh FILES -.Nm -maintains and operates on a ports tree, normally -.Pa /usr/ports . -Some information is gathered from the package database, normally -located in -.Pa /var/db/pkg . -.Sh AUTHORS -.Nm -was written by -.An Dag-Erling Smørgrav Aq des@FreeBSD.org . -Several people contributed their comments and suggestions, most -notably -.An Eivind Eklund Aq eivind@FreeBSD.org . diff --git a/ports-mgmt/porteasy/src/porteasy.pl b/ports-mgmt/porteasy/src/porteasy.pl deleted file mode 100644 index 2331e2c4441f..000000000000 --- a/ports-mgmt/porteasy/src/porteasy.pl +++ /dev/null @@ -1,999 +0,0 @@ -#!/usr/bin/perl -w -#- -# Copyright (c) 2000 Dag-Erling Coïdan Smørgrav -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer -# in this position and unchanged. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - -use strict; -use Fcntl; -use Getopt::Long; - -my $VERSION = "2.2"; -my $COPYRIGHT = "Copyright (c) 2000 Dag-Erling Smørgrav. All rights reserved."; - -# Constants -sub ANONCVS_ROOT { ":pserver:anoncvs\@anoncvs.FreeBSD.org:/home/ncvs" } -sub REQ_EXPLICIT { 1 } -sub REQ_IMPLICIT { 2 } -sub REQ_MASTER { 4 } - -sub PATH_CVS { "/usr/bin/cvs" } -sub PATH_LDCONFIG { "/sbin/ldconfig" } -sub PATH_MAKE { "/usr/bin/make" } - -# Global parameters -my $dbdir = "/var/db/pkg"; # Package database directory -my $index = undef; # Index file -my $portsdir = "/usr/ports"; # Ports directory -my $tag = undef; # cvs tag to use -my $date = undef; # cvs date to use - -# Global flags -my $anoncvs = 0; # Use anoncvs.FreeBSD.org -my $clean = 0; # Clean ports -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 $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 $update = 0; # Update ports tree from CVS -my $verbose = 0; # Verbose mode - -# Global variables -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 $suppressed; # Suppress output - -# -# Shortcut for 'print STDERR' -# -sub stderr(@) { - print(STDERR @_); -} - -# -# Similar to err(3) -# -sub bsd::err($$@) { - my $code = shift; # Return code - my $fmt = shift; # Format string - my @args = @_; # Arguments - - my $msg; # Error message - - $msg = sprintf($fmt, @args); - stderr("$msg: $!\n"); - exit($code); -} - -# -# Similar to errx(3) -# -sub bsd::errx($$@) { - my $code = shift; # Return code - my $fmt = shift; # Format string - my @args = @_; # Arguments - - my $msg; # Error message - - $msg = sprintf($fmt, @args); - stderr("$msg\n"); - exit($code); -} - -# -# Similar to warn(3) -# -sub bsd::warn($@) { - my $fmt = shift; # Format string - my @args = @_; # Arguments - - my $msg; # Error message - - $msg = sprintf($fmt, @args); - stderr("$msg: $!\n"); -} - -# -# Similar to warnx(3) -# -sub bsd::warnx($@) { - my $fmt = shift; # Format string - my @args = @_; # Arguments - - my $msg; # Error message - - $msg = sprintf($fmt, @args); - stderr("$msg\n"); -} - -# -# Call the specified sub with output suppressed -# -sub suppress($@) { - my $subr = shift; # Subroutine to call - my @args = @_; # Arguments - - my $oldsuppressed; # Old suppress flag - my $rtn; # Return value - - if (!$verbose) { - $oldsuppressed = $suppressed; - $suppressed = 1; - } - $rtn = &{$subr}(@args); - if (!$verbose) { - $suppressed = $oldsuppressed; - } - return $rtn; -} - - -# -# Print an info message -# -sub info(@) { - - my $msg; # Message - - if ($verbose) { - $msg = join(' ', @_); - chomp($msg); - stderr("$msg\n"); - } -} - -# -# Print an info message about a subprocess -# -sub cmdinfo(@) { - info(">>>", @_); -} - -# -# Change working directory -# -sub cd($) { - my $dir = shift; # Directory to change to - - cmdinfo("cd $dir"); - chdir($dir) - or bsd::err(1, "unable to chdir to %s", $dir); -} - -# -# Run a command and return its output -# -sub cmd($@) { - my $cmd = shift; # Command to run - my @args = @_; # Arguments - - my $pid; # Child pid - local *PIPE; # Pipe - my $output; # Output - - cmdinfo(join(" ", $cmd, @args)); - if (!defined($pid = open(PIPE, "-|"))) { - bsd::err(1, "open()"); - } elsif ($pid == 0) { - exec($cmd, @args); - die("child: exec(): $!\n"); - } - $output = ""; - while (<PIPE>) { - $output .= $_; - if (!$suppressed) { - stderr($_); - } - } - if (!close(PIPE)) { - if ($? & 0xff) { - bsd::warnx("%s caught signal %d", $cmd, $? & 0x7f); - } elsif ($? >> 8) { - bsd::warnx("%s returned exit code %d", $cmd, $? >> 8); - } else { - bsd::warn("close()"); - } - return undef; - } - return $output || "\n"; -} - -# -# Run CVS -# -sub cvs($;@) { - my $cmd = shift; # CVS command - - my @args; # Arguments to CVS - - if (!$update) { - return "\n"; - } - if (!$verbose) { - push(@args, "-q"); - } - push(@args, "-f", "-z3", "-R", "-d$cvsroot", $cmd, "-A"); - if ($cmd eq "checkout") { - push(@args, "-P"); - } elsif ($cmd eq "update") { - push(@args, "-P", "-d"); - } - if ($tag) { - push(@args, "-r$tag"); - } - if ($date) { - push(@args, "-D$date"); - } - push(@args, @_); - return cmd(&PATH_CVS, @args); -} - -# -# Run make -# -sub make($@) { - my $port = shift; # Port category/name - my @args = @_; - - push(@args, "PORTSDIR=$portsdir") - unless ($portsdir eq "/usr/ports"); - cd("$portsdir/$port"); - return cmd(&PATH_MAKE, @args); -} - -# -# The undocumented command. -# -sub ecks() { - - local *FILE; # File handle - - sysopen(FILE, "/var/db/port.mkversion", O_RDWR|O_CREAT|O_TRUNC, 0644) - or bsd::err(1, "open()"); - print(FILE "20380119\n"); - close(FILE); -} - -# -# Update the index file -# -sub update_index() { - - my $parent; # Parent directory - - $parent = $portsdir; - $parent =~ s/\/*ports\/*$//; - cd($parent); - if (-f "ports/INDEX" || (-d "ports" && -d "ports/CVS")) { - cvs("update", "ports/INDEX") - or bsd::errx(1, "error updating the index file"); - } else { - cvs("checkout", "-l", "ports") - or bsd::errx(1, "error checking out the index file"); - } - cvs("update", "-l", "ports/Mk") - or bsd::errx(1, "error updating the Makefiles"); -} - -# -# Read the ports index -# -sub read_index() { - - local *INDEX; # File handle - my $line; # Line from file - - info("Reading index file"); - sysopen(INDEX, $index, O_RDONLY) - or bsd::err(1, "can't open $index"); - while ($line = <INDEX>) { - my @port; # Port info - - @port = split(/\|/, $line, 3); - $port[1] =~ s|^/usr/ports/*||; - $ports{$port[0]} = $port[1]; - $pkgname{$port[1]} = $port[0]; - } - close(INDEX); - info(keys(%ports) . " ports in index"); -} - -# -# Find a port by a portion of it's package name -# -sub find_port($) { - my $port = shift; # Port to find - - my @suggest; # Suggestions - - stderr("Can't find required port '$port'"); - @suggest = grep(/^$port/i, keys(%ports)); - if (@suggest == 1 && $suggest[0] =~ m/^$port[0-9.-]/) { - $port = $ports{$suggest[0]}; - stderr(", assuming you mean $pkgname{$port}.\n"); - return $port; - } elsif (@suggest) { - stderr(", maybe you mean:\n " . (join("\n ", @suggest))); - } - stderr("\n"); - return undef; -} - -# -# Add a port to the list of required ports -# -sub add_port($$) { - my $port = shift; # Port to add - my $req = shift; # Requirement (explicit or implicit) - - my $realport; # Real port name - - if ($port =~ m|^([^/]+/[^/]+)$|) { - $realport = $1; - } else { - if (exists($ports{$port})) { - $realport = $ports{$port}; - } else { - $realport = find_port($port); - } - } - if (!$realport) { - return 1; - } - if (!exists($reqd{$realport})) { - $reqd{$realport} = 0; - } - $reqd{$realport} |= $req; - return 0; -} - -# -# Find master directory for a port -# -sub find_master($) { - my $port = shift; # Port - - local *FILE; # File handle - my $master; # Master directory - - if ($masterport{$port}) { - return $masterport{$port}; - } - - # Look for MASTERDIR in the Makefile. We can't use 'make -V' - # because the Makefile might try to include the master port's - # Makefile, which might not be checked out yet. - open(FILE, "$portsdir/$port/Makefile") - or bsd::err(1, "unable to read Makefile for $port"); - while (<FILE>) { - if (/^MASTERDIR\s*=\s*(\S+)\s*$/) { - $master = $1; - } elsif (/^\.?include \"([^\"]+)\/Makefile\"\s*$/) { - $master = $1; - } - if (defined($master)) { - $master =~ s/^\$\{.CURDIR\}//; - $master = "/$port/$master"; - $master =~ s|/+|/|g; - 1 while ($master =~ s|/[^\./]*/\.\./|/|); - $master =~ s|^/||; - if ($master !~ m|^[^/]+/[^/]+$|) { - bsd::warn("invalid master for %s: %s", $port, $master); - next; - } - close(FILE); - info("$master is master for $port\n"); - return $masterport{$port} = $master; - } - } - close(FILE); - return undef; -} - -# -# Find a dynamic library -# -sub find_library($) { - my $library = shift; # Library to find - - my $ldconfig; # Output from ldconfig(8) - - $ldconfig = suppress(\&cmd, (&PATH_LDCONFIG, "-r")) - or errx(1, "unable to run ldconfig"); - if ($ldconfig =~ m/^\s*\d+:-l$library => (.*)$/m) { - info("The $library library is installed as $1"); - return 1; - } - return 0; -} - -# -# Find a binary -# -sub find_binary($) { - my $binary = shift; # Binary to find - - my $dir; # Directory - - if ($binary =~ m|^/|) { - info("$binary is installed as $binary"); - return (-x $binary); - } - foreach $dir (split(/:/, $ENV{'PATH'})) { - if (-x "$dir/$binary") { - info("$binary is installed as $dir/$binary"); - return 1; - } - } - return 0; -} - -# -# Find a port's dependencies -# -sub find_dependencies($) { - my $port = shift; # Port - - my $dependvars; # Dependency variables - my $item; # Iterator - my %depends; # Hash of dependencies - my ($lhs, $rhs); # Left, right hand side of dependency spec - - $dependvars = suppress(\&make, ($port, - "-VFETCH_DEPENDS", - "-VBUILD_DEPENDS", - "-VRUN_DEPENDS", - "-VLIB_DEPENDS", - "-VDEPENDS")) - or bsd::errx(1, "failed to obtain dependency list"); - %depends = (); - foreach $item (split(' ', $dependvars)) { - if ($item !~ m|^([^:]+):$portsdir/([^/:]+/[^/:]+)/?(:[^:]+)?$|) { - bsd::warnx("invalid dependency: %s", $item); - } - ($lhs, $rhs) = ($1, $2); - if ($exclude) { - if ($installed{$rhs}) { - next; - } - info("Verifying status of $rhs ($lhs)"); - if (($lhs =~ m|^/| && -f $lhs) || - ($lhs =~ m/\.\d+$/ && find_library($lhs)) || - find_binary($lhs)) { - info("$rhs seems to be installed"); - $installed{$rhs} = 1; - next; - } - $installed{$rhs} = -1; - } - info("Adding $rhs as a dependency for $port"); - $depends{$rhs} = 1; - } - return keys(%depends); -} - -# -# Update all necessary files to build the specified ports -# -sub update_ports_tree(@) { - my @ports = @_; # Ports to update - - my $port; # Port name - my $category; # Category name - my %upd_cat; # Hash of updated categories - my %upd_port; # Hash of updated ports - my %processed; # Hash of processed ports - my @additional; # Additional dependencies - my $n; # Pass count - - foreach $port (@ports) { - push(@additional, $port); - } - for ($n = 0; ; ++$n) { - my @update_now; # Ports that need updating now - my $item; # Iterator - my $master; # Master port - my $dependency; # Dependency - - # Determine which ports need updating - foreach $item (@additional) { - next if $processed{$item}; - ($category, $port) = split(/\//, $item); - if (!exists($upd_port{$category})) { - $upd_port{$category} = {}; - } - if (!exists($upd_port{$category}->{$port})) { - $upd_port{$category}->{$port} = 0; - } - push(@update_now, $item); - } - last unless @update_now; - info("Pass $n:", @update_now); - - # Update the relevant sections of the ports tree - foreach $category (keys(%upd_port)) { - my @ports; # Ports to update - - if (!$upd_cat{$category}) { - cd($portsdir); - cvs("update", "-l", $category) - or bsd::errx(1, "error updating the '$category' category"); - $upd_cat{$category} = 1; - } - foreach $port (keys(%{$upd_port{$category}})) { - next if ($upd_port{$category}->{$port}); - push(@ports, $port); - $upd_port{$category}->{$port} = 1; - } - if (@ports) { - cd("$portsdir/$category"); - cvs("update", @ports) - or bsd::errx(1, "error updating the '$category' category"); - } - } - - # Process all unprocessed ports we know of so far - foreach $port (@update_now) { - # See if the port has an unprocessed master port - if (($master = find_master($port)) && !$processed{$master}) { - add_port($master, &REQ_MASTER); - info("Adding $master to head of line\n"); - unshift(@additional, $master); - # Need to process master before we continue - next; - } - - # Find the port's package name - if (!exists($pkgname{$port})) { - if ($pkgname{$port} = suppress(\&make, ($port, "-VPKGNAME"))) { - chomp($pkgname{$port}); - } else { - warnx("failed to obtain package name for $port"); - } - } - - # Find the port's dependencies - foreach $dependency (find_dependencies($port)) { - next if ($processed{$dependency}); - if ($reqd{$port} == &REQ_MASTER) { - add_port($dependency, &REQ_MASTER); - } else { - add_port($dependency, &REQ_IMPLICIT); - } - info("Adding $dependency to back of line\n"); - push(@additional, $dependency); - } - - # Mark port as processed - $processed{$port} = 1; - } - } -} - -# -# Show port info -# -sub show_port_info($) { - my $port = shift; # Port to show info for - - local *FILE; # File handle - my $info; # Port info - - sysopen(FILE, "$portsdir/$port/pkg-descr", O_RDONLY) - or bsd::err(1, "can't read description for $port"); - $info = join("| ", <FILE>); - close(FILE); - print("+--- Description for $port ($pkgname{$port}):\n| ${info}+---\n"); -} - -# -# Show port plist -# -sub show_port_plist($) { - my $port = shift; # Port to show plist for - - my $master; # Master port - local *FILE; # File handle - my $file; # File name - my %files; # Files to list - my $prefix; # Prefix - - $prefix = suppress(\&make, ($port, "-VPREFIX")); - chomp($prefix); - $master = $port; - while (!-f "$portsdir/$master/pkg-plist") { - if (!($master = $masterport{$master})) { - bsd:errx(1, "$port has no packing list"); - } - } - sysopen(FILE, "$portsdir/$master/pkg-plist", O_RDONLY) - or bsd::err(1, "can't read packing list for $port"); - while (<FILE>) { - chomp(); - $file = undef; - if (m/^[^\@]/) { - $file = $_; - } elsif (m/^\@cwd\s+(\S+)\s*$/) { - $prefix = $1; - } elsif (m/^\@dirrm\s+(\S+)\s*$/) { - $file = "$1/"; - } elsif (m/^\@comment\s+/) { - # ignore - } else { - bsd::warnx("unrecognized plist directive: $_"); - } - if (defined($file)) { - if ($file !~ m/^\//) { - $file = "$prefix/$file"; - } - $file =~ s|/+|/|g; - $files{$file} = 1; - } - } - close(FILE); - # XXX list man pages? - print("+--- Packing list for $port ($pkgname{$port}):\n"); - foreach (sort(keys(%files))) { - print("| $_\n"); - } - print("+---\n"); -} - -# -# List installed ports -# -sub list_installed() { - - local *DIR; # Directory handle - my $port; # Port name - my $unknown; # Unknown ports - - 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 { - print(" ? $port\n"); - ++$unknown; - } - } - if ($unknown) { - print("Recommend you run pkg_version(1).\n"); - } -} - -# -# Clean a port -# -sub clean_port($) { - my $port = shift; # Port to clean - - make($port, "clean") - or bsd::warnx("failed to clean %s", $port); -} - -# -# Clean the tree -# -sub clean_tree() { - - my $port; # Port name - - # We could just cd to $portsdir and 'make clean', but it'd - # be extremely noisy due to only having a partial tree - foreach $port (keys(%ports)) { - if (-d "$portsdir/$port") { - make($port, "clean", "NO_DEPENDS=yes") - or bsd::warnx("failed to clean %s", $port); - } - } -} - -# -# Fetch a port -# -sub fetch_port($) { - my $port = shift; # Port to fetch - - make($port, "fetch") - or bsd::errx(1, "failed to fetch %s", $port); -} - -# -# Build a port -# -sub build_port($) { - my $port = shift; # Port to build - - my @makeargs; # Arguments to make() - - if ($packages) { - push(@makeargs, "package", "DEPENDS_TARGET=package"); - } else { - push(@makeargs, "install"); - } - if ($force) { - push(@makeargs, "-DFORCE_PKG_REGISTER"); - } - if (!$dontclean) { - push(@makeargs, "clean"); - } - make($port, @makeargs) - or bsd::errx(1, "failed to %s %s", $packages ? "package" : "build", $port); -} - -# -# Print usage message and exit -# -sub usage() { - - stderr("Usage: porteasy [-abCceFfhikluVv] [-d dir] [-D date]\n" . - " [-p dir] [-r dir] [-t tag] [port ...]\n"); - exit(1); -} - -# -# Print version -# -sub version() { - - stderr("This is porteasy $VERSION. -$COPYRIGHT -"); - exit(1); -} - -# -# Print help text -# -sub help() { - - stderr("This is porteasy $VERSION. -$COPYRIGHT - -Options: - -a, --anoncvs Use the FreeBSD project's anoncvs server - -b, --build Build required ports - -c, --clean Clean the specified ports - -C, --dontclean Don't clean after build - -e, --exclude-installed Exclude installed ports - -f, --fetch Fetch distfiles - -h, --help Show this information - -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 - -u, --update Update relevant portions of the ports tree - -V, --version Show version number - -v, --verbose Verbose mode - -Parameters: - -D, --date=DATE Specify CVS date - -d, --dbdir=DIR Specify package directory (default $dbdir) - -p, --portsdir=DIR Specify ports directory (default $portsdir) - -r, --cvsroot=DIR Specify CVS root - -t, --tag=TAG Specify CVS tag - -Report bugs to <des\@freebsd.org>. -"); - exit(1); -} - -MAIN:{ - my $port; # Port name - my $err = 0; # Error count - my $need_index; # Need the index - - # Get option defaults - if ($ENV{'PORTEASY_OPTIONS'}) { - foreach (split(' ', $ENV{'PORTEASY_OPTIONS'})) { - unshift(@ARGV, $_); - } - } - - # Scan command line options - Getopt::Long::Configure("auto_abbrev", "bundling"); - GetOptions( - "a|anoncvs" => \$anoncvs, - "b|build" => \$build, - "c|clean" => \$clean, - "C|dontclean" => \$dontclean, - "D|date=s" => \$date, - "d|dbdir=s" => \$dbdir, - "e|exclude-installed" => \$exclude, - "F|force-pkg-register" => \$force, - "f|fetch" => \$fetch, - "h|help" => \&help, - "i|info" => \$info, - "k|packages" => \$packages, - "L|plist" => \$plist, - "l|list" => \$list, - "p|portsdir=s" => \$portsdir, - "r|cvsroot=s" => \$cvsroot, - "t|tag=s" => \$tag, - "u|update" => \$update, - "V|version" => \&version, - "v|verbose" => \$verbose, - "x|ecks" => \&ecks, - ) - or usage(); - - if (!($clean || $fetch || $info || $list || $packages || $plist)) { - $build = 1; - } - - if (!@ARGV && ($build || $fetch || $list || $packages || $plist)) { - usage(); - } - - if ($portsdir !~ m/^\//) { - $portsdir = `pwd` . $portsdir; - $portsdir =~ s/\n/\//s; - } - - if ($portsdir !~ m/\/ports\/?$/) { - bsd::errx(1, "ports directory must be named 'ports'"); - } - - $index = "$portsdir/INDEX"; - - # 'package' implies 'build' - if ($packages) { - $build = 1; - } - - # Set and check CVS root - if ($anoncvs && !$cvsroot) { - $cvsroot = &ANONCVS_ROOT; - } - if (!$cvsroot) { - $cvsroot = $ENV{'CVSROOT'}; - } - if ($update && !$cvsroot) { - 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 - if ($need_index) { - update_index(); - read_index(); - } - - # Step 2: build list of explicitly required ports - foreach $port (@ARGV) { - $err += add_port($port, &REQ_EXPLICIT); - } - if ($err) { - bsd::errx(1, "some required ports were not found."); - } - - # Step 3: update port directories and discover dependencies - if (!($build || $fetch || ($info && @ARGV) || $list)) { - $update = 0; - } - update_ports_tree(keys(%reqd)); - - # Step 4: deselect ports which are already installed - if ($exclude) { - foreach $port (keys(%reqd)) { - if ((exists($installed{$port}) && $installed{$port} > 0) || - -d "$dbdir/$pkgname{$port}") { - info("$port is already installed"); - delete $reqd{$port}; - } - } - } - - # Step 5: list selected ports - if ($list) { - foreach $port (sort(keys(%reqd))) { - next if ($reqd{$port} == &REQ_MASTER); - print((($reqd{$port} & &REQ_EXPLICIT) ? " * " : " "), - "$port ($pkgname{$port})\n"); - } - } - - # Step 6: show info (or list installed packages) - if ($info) { - if (!@ARGV) { - list_installed(); - } else { - foreach $port (keys(%reqd)) { - if ($reqd{$port} & &REQ_EXPLICIT) { - show_port_info($port); - } - } - } - } - - # Step 7: show packing list - if ($plist) { - foreach $port (keys(%reqd)) { - if ($reqd{$port} & &REQ_EXPLICIT) { - show_port_plist($port); - } - } - } - - # Step 8: clean the ports directories (or the entire tree) - if ($clean) { - if (!@ARGV) { - clean_tree(); - } else { - foreach $port (keys(%reqd)) { - if ($reqd{$port} & &REQ_EXPLICIT) { - clean_port($port); - } - } - } - } - - # Step 9: fetch distfiles - if ($fetch) { - foreach $port (keys(%reqd)) { - if ($reqd{$port} != &REQ_MASTER) { - fetch_port($port); - } - } - } - - # Step A: build ports - only the explicitly required ones, since - # some dependencies (most commonly XFree86) may be bogus. - if ($build || $packages) { - foreach $port (keys(%reqd)) { - if ($reqd{$port} & &REQ_EXPLICIT) { - build_port($port); - } - } - } - - # Done! - exit(0); -} |