aboutsummaryrefslogtreecommitdiff
path: root/ports-mgmt/porteasy
diff options
context:
space:
mode:
authorDmitry Marakasov <amdmi3@FreeBSD.org>2015-06-02 02:33:06 +0000
committerDmitry Marakasov <amdmi3@FreeBSD.org>2015-06-02 02:33:06 +0000
commit6ef8313a3841611321143d08c3da09ef7c53a920 (patch)
tree615ae0f18bacb3e94d7ef4a6942810540e5f6a83 /ports-mgmt/porteasy
parent269e9ba9efae97608ae4b569b07f350ee9d388f8 (diff)
downloadports-6ef8313a3841611321143d08c3da09ef7c53a920.tar.gz
ports-6ef8313a3841611321143d08c3da09ef7c53a920.zip
Notes
Diffstat (limited to 'ports-mgmt/porteasy')
-rw-r--r--ports-mgmt/porteasy/Makefile27
-rw-r--r--ports-mgmt/porteasy/pkg-descr22
-rw-r--r--ports-mgmt/porteasy/pkg-plist2
-rw-r--r--ports-mgmt/porteasy/src/porteasy.8354
-rw-r--r--ports-mgmt/porteasy/src/porteasy.pl1361
5 files changed, 0 insertions, 1766 deletions
diff --git a/ports-mgmt/porteasy/Makefile b/ports-mgmt/porteasy/Makefile
deleted file mode 100644
index 320f29eb827b..000000000000
--- a/ports-mgmt/porteasy/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-# $FreeBSD$
-
-PORTNAME= porteasy
-PORTVERSION= 2.8.5
-CATEGORIES= ports-mgmt
-MASTER_SITES= # none
-DISTFILES= # none
-
-MAINTAINER= des@FreeBSD.org
-COMMENT= Tool for fetching and building ports
-
-DEPRECATED= Does not support pkgng
-EXPIRATION_DATE= 2015-05-31
-
-NO_BUILD= yes
-NO_WRKSUBDIR= yes
-USES= perl5
-
-SRC= ${.CURDIR}/src
-
-do-configure:
- @${SED} "s,%%PREFIX%%,${PREFIX}," ${SRC}/porteasy.pl >${WRKDIR}/porteasy
-do-install:
- @${INSTALL_SCRIPT} ${WRKDIR}/porteasy ${STAGEDIR}${PREFIX}/bin/porteasy
- @${INSTALL_MAN} ${SRC}/porteasy.8 ${STAGEDIR}${PREFIX}/man/man8
-
-.include <bsd.port.mk>
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 a73aa55a93b7..000000000000
--- a/ports-mgmt/porteasy/pkg-plist
+++ /dev/null
@@ -1,2 +0,0 @@
-bin/porteasy
-man/man8/porteasy.8.gz
diff --git a/ports-mgmt/porteasy/src/porteasy.8 b/ports-mgmt/porteasy/src/porteasy.8
deleted file mode 100644
index 007088877156..000000000000
--- a/ports-mgmt/porteasy/src/porteasy.8
+++ /dev/null
@@ -1,354 +0,0 @@
-.\"-
-.\" Copyright (c) 2000-2005 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.
-.\" 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.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 August 12, 2005
-.Dt PORTEASY 8
-.Os
-.Sh NAME
-.Nm porteasy
-.Nd fetch and build ports
-.Sh SYNOPSIS
-.Nm
-.Op Fl AabCceFfhIikLlRSsuVvw
-.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 | Fl D Ns Ar VAR | Fl D Ns Ar VAR Ns = Ns Ar VAL ...
-.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 one of the FreeBSD project's anonymous CVS servers.
-Note that this forces the use of
-.Xr ssh 1 ,
-regardless of the
-.Fl R
-and
-.Fl S
-options.
-.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
-Select installed ports.
-.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
-Force the use of
-.Xr rsh 1
-to connect to remote CVS repositories.
-By default,
-.Nm
-respects the existing
-.Ev CVS_RSH
-setting.
-This option is ignored when using anoncvs.
-.It Fl r Ar dir
-Specify the location of the CVS repository.
-.It Fl S
-Force the use of
-.Xr ssh 1
-to connect to remote CVS repositories.
-By default,
-.Nm
-respects the existing
-.Ev CVS_RSH
-setting.
-This option is ignored when using anoncvs.
-.It Fl s
-Indicate the installation status of the selected ports.
-Each selected port is listed with a symbol indicating its status:
-.Bl -tag -width 3n
-.It Ql \&!
-Not installed.
-.It Ql " "
-Up-to-date.
-.It Ql \&<
-Older than the version in the ports tree.
-.It Ql \&>
-Newer than the version in the ports tree.
-.El
-.Pp
-If the
-.Fl s
-option is specified and no ports are specified on the command line,
-all installed ports are selected as if the
-.Fl I
-option had been specified.
-.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.
-.It Fl w
-Show the URL of the port's web site if there is one listed in the port
-description.
-.El
-.Ss Environment settings
-Any command line argument of the form
-.Fl D Ns Ar VAR ,
-.Fl D Ns Ar VAR Ns = Ns Ar VAL
-or
-.Ar VAR Ns = Ns Ar VAL
-is interpreted as a variable assignment which will be exported into
-subprocesses' environments.
-Thus compile-time configuration options can be specified on the
-.Nm
-command line.
-.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 ports tree infrastructure
-If the
-.Fl u
-option was specified, the root of the ports tree and important
-subdirectories
-.Po
-.Pa Mk ,
-.Pa Templates
-and
-.Pa Tools
-.Pc
-are updated using
-.Xr cvs 1 .
-If possible, an up-to-date index is retrieved from the
-.Fx
-website; otherwise, the version obtained from CVS will be used.
-.It Select ports
-The selection list is initialized with the ports listed on the command
-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,
-.Nm
-prints a list of possible matches and exits.
-.Pp
-All direct and indirect dependencies (except, if the
-.Fl e
-option was specified,
-those that are already installed) 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 sometimes fails to detect
-that 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 List installed ports
-If the
-.Fl s
-option was specified, all selected ports are listed with their status.
-.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.
-.It Show the URLs of the selected ports' web sites
-If the
-.Fl w
-option was specified,
-.Nm
-prints the URL of the web site of each port that was specified on the
-command line, if a URL is listed in that port's description.
-.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 checksum
-target on every selected port.
-This fetches the distfiles and verifies their checksums.
-.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
-.Pp
-The following variables are removed from the environment before any
-work is performed:
-.Ev CLASSPATH ,
-.Ev LD_* ,
-.Ev JAVA_* ,
-.Ev USE_* ,
-.Ev WANT_* .
-.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 14a2da966273..000000000000
--- a/ports-mgmt/porteasy/src/porteasy.pl
+++ /dev/null
@@ -1,1361 +0,0 @@
-#!/usr/bin/env perl -w
-#-
-# Copyright (c) 2000-2011 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.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.8.5";
-my $COPYRIGHT = "Copyright (c) 2000-2011 Dag-Erling Smørgrav. " .
- "All rights reserved.";
-
-# Constants
-sub ANONCVS_ROOT { ":ext:anoncvs\@anoncvs.FreeBSD.org:/home/ncvs" }
-sub REQ_EXPLICIT { 1 }
-sub REQ_IMPLICIT { 2 }
-
-sub PATH_BZIP2 { "/usr/bin/bzip2" }
-sub PATH_CVS { "/usr/bin/cvs" }
-sub PATH_FETCH { "/usr/bin/fetch" }
-sub PATH_LDCONFIG { "/sbin/ldconfig" }
-sub PATH_MAKE { "/usr/bin/make" }
-sub PATH_RSH { "/usr/bin/rsh" }
-sub PATH_SSH { "/usr/bin/ssh" }
-
-# Global parameters
-my $dbdir = "/var/db/pkg"; # Package database directory
-my $index = undef; # INDEX file
-my $moved = undef; # MOVED file
-my $portsdir = "/usr/ports"; # Ports directory
-my $tag = undef; # CVS tag to use
-my $date = undef; # CVS date to use
-my $release = undef; # OS release
-
-# Global flags
-my $anoncvs = 0; # Use anoncvs1.FreeBSD.org
-my $build = 0; # Build ports
-my $clean = 0; # Clean ports
-my $cvsroot = 0; # CVS root directory
-my $dontclean = 0; # Don't clean after build
-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 $installed = 0; # Select installed ports
-my $list = 0; # List ports
-my $packages = 0; # Build packages
-my $plist = 0; # Print packing list
-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 $need_deps; # Need dependency information
-my $have_index; # INDEX has been read
-my $have_moved; # MOVED 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 %have_dep; # Dependencies that are already present
-my %port_dep; # Map ports to their dependency lists
-my %installed; # Installed ports
-my %moved; # Ports that have moved
-my $capture; # Capture output
-
-#
-# Set process title
-#
-sub setproctitle(;$) {
- my $title = shift;
-
- $0 = "porteasy $VERSION";
- $0 .= ": $title"
- if defined($title);
-}
-
-#
-# 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 $capture set
-#
-sub capture($@) {
- my $subr = shift; # Subroutine to call
- my @args = @_; # Arguments
-
- my $oldcapture; # Old capture flag
- my $rtn; # Return value
-
- $oldcapture = $capture;
- $capture = 1;
- $rtn = &{$subr}(@args);
- $capture = $oldcapture;
- 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
- my $rtn; # Return value
-
- cmdinfo(join(" ", $cmd, @args));
- $pid = ($capture || $verbose) ? open(PIPE, "-|") : fork();
- if (!defined($pid)) {
- bsd::err(1, ($capture || $verbose) ? "open()" : "fork()");
- } elsif ($pid == 0) {
- exec($cmd, @args);
- die("child: exec(): $!\n");
- }
- if ($capture || $verbose) {
- $output = "";
- while (<PIPE>) {
- $output .= $_;
- if ($verbose) {
- stderr($_);
- }
- }
- }
- $rtn = ($capture || $verbose) ? close(PIPE) : (waitpid($pid, 0) == $pid);
- if (!$rtn) {
- 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;
- }
- if ($capture) {
- $output =~ s/\n*$//s;
- return $output;
- }
- return 1;
-}
-
-#
-# 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", "-T");
- 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 root of the ports tree
-#
-sub update_root() {
- my $parent; # Parent directory
-
- $parent = $portsdir;
- $parent =~ s/\/*ports\/*$//;
- if (! -d "ports/CVS") {
- cd($parent);
- cvs("checkout", "-l", "ports")
- or bsd::errx(1, "error checking out the root of the ports tree");
- cd($portsdir);
- } else {
- cd($portsdir);
- cvs("update", "-l")
- or bsd::errx(1, "error updating the root of the ports tree");
- }
- if ($packages && ! -d "$portsdir/packages") {
- mkdir("$portsdir/packages", 0777)
- or bsd::errx(1, "error creating the package directory");
- }
- cvs("update", "Mk", "Templates", "Tools")
- or bsd::errx(1, "error updating the ports infrastructure");
- $moved = "$portsdir/MOVED";
-}
-
-#
-# Update the index
-#
-sub update_index() {
- my $ifn; # Index file name
-
- cd($portsdir);
- $ifn = capture(\&cmd, ("make", "-VINDEXFILE"));
- if ($update || ! -f $ifn) {
- my $izfn = "$ifn.bz2";
- info("Retrieving $izfn");
- if (!cmd(&PATH_FETCH, $verbose ? "-mv" : "-m",
- "http://www.freebsd.org/ports/$izfn") || ! -f $izfn) {
- bsd::errx(1, "Failed to retrieve index file");
- }
- if (! -f $ifn || (stat($izfn))[9] > (stat($ifn))[9]) {
- info("Decompressing $izfn");
- if (!cmd(&PATH_BZIP2, "-dfk", $izfn)) {
- bsd::errx(1, "Failed to decompress index file");
- }
- }
- }
- $index = "$portsdir/$ifn";
- if (! -f $index) {
- $index = "$portsdir/INDEX";
- }
-}
-
-#
-# Read the ports index
-#
-sub read_index() {
- local *INDEX; # File handle
- my $line; # Line from file
-
- return if ($have_index);
- update_index();
- info("Reading $index");
- 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");
- $have_index = 1;
-}
-
-#
-# Read the list of moved ports
-#
-sub read_moved() {
- local *MOVED; # File handle
- my $line; # Line from file
-
- return if ($have_moved);
- info("Reading $moved");
- sysopen(MOVED, $moved, O_RDONLY)
- or bsd::err(1, "can't open $moved");
- while ($line = <MOVED>) {
- if ($line =~ m/^([\w\/-]+)\|([\w\/-]*)\|([\d-]+)\|(.*)$/) {
- $moved{$1} = [ $2, $3, $4 ];
- }
- }
- $have_moved = 1;
-}
-
-#
-# 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'");
- my $portre = $port;
- $portre =~ s/([^\w\*\?])/\\$1/g;
- $portre =~ s/\*/\.\*/g;
- $portre =~ s/\?/\./g;
- @suggest = grep(/^$portre/i, keys(%ports));
- if (@suggest == 1 && $suggest[0] =~ m/^$portre[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;
-}
-
-#
-# Find out if a port has moved
-#
-sub find_moved($) {
- my $port = shift; # Port to check
-
- my $date = "1900-01-01";
-
- if (!$have_moved) {
- read_moved();
- }
- while (exists($moved{$port}) && $moved{$port}->[1] gt $date) {
- if (!$moved{$port}->[0]) {
- info("$port was removed" .
- " on $moved{$port}->[1]: $moved{$port}->[2]");
- return undef;
- }
- info("$port was renamed to $moved{$port}->[0]" .
- " on $moved{$port}->[1]: $moved{$port}->[2]");
- ($port, $date) = @{$moved{$port}};
- }
- return $port;
-}
-
-#
-# 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 (!$have_index) {
- read_index();
- }
- if (exists($ports{$port})) {
- $realport = $ports{$port};
- } else {
- $realport = find_port($port);
- }
- if ($realport) {
- $realport = find_moved($realport);
- }
- }
- if (!$realport) {
- return 1;
- }
- if (!exists($reqd{$realport})) {
- $reqd{$realport} = 0;
- }
- $reqd{$realport} |= $req;
- return 0;
-}
-
-#
-# 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) {
- warn("$port has no known origin\n");
- return undef;
- }
- info("$port -> $origin\n");
- $origin = find_moved($origin);
- return $origin;
-}
-
-#
-# Get list of installed ports
-#
-sub get_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");
- $origin = get_origin($port);
- if (!defined($origin) || !$origin) {
- bsd::warnx("$port has no known origin");
- } else {
- if ($installed{$origin}) {
- bsd::warnx("$origin is already installed as " .
- join(', ', @{$installed{$origin}}));
- } else {
- $installed{$origin} = [ ];
- }
- push(@{$installed{$origin}}, $port);
- }
- }
- closedir(DIR);
-}
-
-#
-# Find master directory for a port
-#
-sub find_master($) {
- my $port = shift; # Port
-
- local *FILE; # File handle
-
- 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.
- sysopen(FILE, "$portsdir/$port/Makefile", O_RDONLY)
- or bsd::err(1, "unable to read Makefile for $port");
- while (<FILE>) {
- my $master; # Master directory
-
- if (/^MASTERDIR\s*=\s*(\S+)\s*$/) {
- $master = $1;
- } elsif (/^\.?include \"([^\s\"]+)\/(?:[^\s\/\"]*)\"\s*$/) {
- $master = $1;
- }
- if (defined($master) && $master !~ m/WRKDIRPREFIX/) {
- $master =~ s/^\$\{.CURDIR\}//;
- $master =~ s/^\$\{PORTSDIR\}/..\/../;
- $master = "/$port/$master";
- $master =~ s|/+|/|g;
- 1 while ($master =~ s|/[^\./]*/\.\./|/|);
- $master =~ s|^/||;
- $master =~ s|/$||;
- if ($master eq $port) {
- #bsd::warnx("master port heuristics failed for %s", $port);
- next;
- }
- if ($master !~ m|^[^/]+/[^/]+$|) {
- bsd::warnx("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 = capture(\&cmd, (&PATH_LDCONFIG, "-r"));
- defined($ldconfig)
- or errx(1, "unable to run ldconfig");
- if ($ldconfig =~ m/^\s*\d+:-l$library(\.\d+)* => (.*)$/m) {
- info("The $library library is installed as $2");
- return 1;
- }
- return 0;
-}
-
-#
-# Find a file
-#
-sub find_file($) {
- my $file = shift; # File to find
-
- my $dir; # Directory
-
- if ($file =~ m|^/|) {
- if (-e $file) {
- info("$file is installed");
- return 1;
- }
- return 0;
- }
- foreach $dir (split(/:/, $ENV{'PATH'})) {
- if (-x "$dir/$file") {
- info("$file is installed as $dir/$file");
- return 1;
- }
- }
- return 0;
-}
-
-#
-# Process a dependency list
-#
-sub add_dependencies($$@) {
- my $port = shift; # Port
- my $finder = shift; # Finder function
- my @dependlist = @_; # Dependency list
-
- my $item; # Iterator
-
- foreach $item (@dependlist) {
- $item =~ s|\`([^\`]+)\`|capture(\&cmd, "sh", "-c", $1)|eg;
- 1 while ($item =~ s|/[^\./]*/\.\./|/|);
- if ($item !~ m|^(?:([^:]+):)?$portsdir/([^/:]+/[^/:]+)/?(:[^:]+)?$|) {
- bsd::warnx("invalid dependency: %s", $item);
- next;
- }
- my ($lhs, $rhs, $target) = ($1, $2, $3);
- next if ($port_dep{$port}->{$rhs});
- # XXX this isn't quite right; lhs-less dependencies should be
- # XXX checked against /var/db/pkg or something.
- if ($exclude && defined($lhs)) {
- if ($have_dep{$rhs}) {
- next;
- }
- info("Verifying status of $rhs ($lhs)");
- if (($lhs =~ m|^/| && -f $lhs) || &{$finder}($lhs)) {
- info("$rhs seems to be installed");
- $have_dep{$rhs} = 1;
- next;
- }
- $have_dep{$rhs} = -1;
- }
- info("Adding $rhs as a dependency for $port");
- $port_dep{$port}->{$rhs} = $target || 'install';
- }
-}
-
-#
-# Find a port's dependencies
-#
-sub find_dependencies($) {
- my $port = shift; # Port
-
- my $dependvars; # Dependency variables
-
- return () unless $need_deps;
- if (!exists($port_dep{$port})) {
- $dependvars = capture(\&make, ($port, "-VLIB_DEPENDS"));
- defined($dependvars)
- or bsd::errx(1, "failed to obtain dependency list");
- add_dependencies($port, \&find_library, split(' ', $dependvars));
- $dependvars = capture(\&make, ($port,
- "-VEXTRACT_DEPENDS",
- "-VPATCH_DEPENDS",
- "-VFETCH_DEPENDS",
- "-VBUILD_DEPENDS",
- "-VRUN_DEPENDS",
- "-VDEPENDS"));
- defined($dependvars)
- or bsd::errx(1, "failed to obtain dependency list");
- add_dependencies($port, \&find_file, split(' ', $dependvars));
- }
- return keys(%{$port_dep{$port}});
-}
-
-#
-# Update a batch of port directories
-#
-my %have_updated;
-sub update_ports(@) {
- my @origins = @_;
-
- my %need_update;
-
- foreach my $origin (@origins) {
- my ($category, $port) = split('/', $origin);
- if (!exists($have_updated{$category}) ||
- !exists($have_updated{$category}->{$port})) {
- if (!exists($need_update{$category})) {
- $need_update{$category} = { };
- }
- $need_update{$category}->{$port} = 1;
- }
- }
- if (keys(%need_update)) {
- cd($portsdir);
- cvs("update", "-l", keys(%need_update))
- or bsd::errx(1, "error updating categories");
- foreach my $category (keys(%need_update)) {
- if (!exists($have_updated{$category})) {
- $have_updated{$category} = { };
- }
- cd("$portsdir/$category");
- cvs("update", keys(%{$need_update{$category}}))
- or bsd::errx(1, "error updating $category ports");
- foreach my $port (keys(%{$need_update{$category}})) {
- $have_updated{$category}->{$port} = 1;
- }
- }
- }
-}
-
-#
-# Update all necessary files to build the specified ports
-#
-sub update_ports_tree(@) {
- my @ports = @_; # Ports to update
-
- my @more_ports; # Additional ports to update
- my %processed; # Hash of processed ports
- my $n; # Pass count
-
- @more_ports = @ports;
- @ports = ();
- for ($n = 0; ; ++$n) {
- my $item; # Iterator
- my $master; # Master port
- my $dependency; # Dependency
-
- setproctitle("updating");
-
- if (@more_ports) {
- info("Ports added since previous pass:", join(' ', @more_ports));
- update_ports(@more_ports);
- push(@ports, @more_ports);
- @more_ports = ();
- }
- info("Pass $n:", @ports - keys(%processed));
- info("Ports:", sort(@ports));
- info("Processed:", sort(keys(%processed)));
- last if (keys(%processed) == @ports);
-
- # Process all unprocessed ports we know of so far
- foreach my $port (@ports) {
- next if ($processed{$port});
- if (! -f "$portsdir/$port/Makefile") {
- bsd::warnx("$port does not exist in $portsdir");
- $pkgname{$port} = $installed{$port}->[0] || "";
- $processed{$port} = 1;
- next;
- }
- setproctitle("updating $port");
-
- # See if the port has an unprocessed master port
- if (($master = find_master($port)) && !$processed{$master}) {
- info("$port has unprocessed master: $master");
- update_ports($master);
- }
-
- # Find the port's package name
- if (!exists($pkgname{$port})) {
- my $makev = capture(\&make, ($port, "-VPKGNAME"));
- if ($makev =~ m/^\s*(\S+)\s*$/s) {
- $pkgname{$port} = $1;
- } else {
- bsd::warnx("failed to obtain package name for $port");
- }
- }
-
- # Find the port's dependencies
- foreach $dependency (find_dependencies($port)) {
- next if ($processed{$dependency});
- add_port($dependency, &REQ_IMPLICIT);
- info("Adding $dependency to back of line");
- push(@more_ports, $dependency)
- unless(grep({ $_ eq $dependency } (@ports, @more_ports)));
- }
-
- # Mark port as processed
- info("marking $port as processed");
- $processed{$port} = 1;
- }
- }
- setproctitle();
-}
-
-#
-# Find a specific file belonging to a specific port
-#
-sub find_port_file($$) {
- my $port = shift; # Port
- my $file = shift; # File to look for
-
- my $master; # Master port
-
- $master = $port;
- while (!-f "$portsdir/$master/$file") {
- if (!($master = $masterport{$master})) {
- bsd::errx(1, "$port has no $file");
- }
- }
- return "$portsdir/$master/$file";
-}
-
-#
-# 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, find_port_file($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's website URL
-#
-sub show_port_website($) {
- my $port = shift; # Port to show info for
-
- local *FILE; # File handle
- my $website; # Port's website
-
- sysopen(FILE, find_port_file($port, "pkg-descr"), O_RDONLY)
- or bsd::err(1, "can't read description for $port");
- while (<FILE>) {
- if (m/^WWW:\s*(\S+)\s*$/) {
- $website = $1;
- }
- }
- close(FILE);
- if (!defined($website)) {
- bsd::warnx("No website for $port");
- } else {
- print("$website\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 $plist_sub; # Substitution list (text)
- my %plist_sub; # Substitution list (hash)
- my $prefix; # Prefix
-
- $plist_sub = capture(\&make, ($port, "-VPLIST_SUB"));
- while ($plist_sub =~ m/\G\s*(\w+)=(\"[^\"]*\"|[^\"\s]*)/g) {
- my ($lhs, $rhs) = ($1, $2);
- $rhs =~ s/^\"(.*)\"$/$1/;
- $plist_sub{$lhs} = $rhs;
- }
- $prefix = capture(\&make, ($port, "-VPREFIX"));
- chomp($prefix);
- sysopen(FILE, find_port_file($port, "pkg-plist"), O_RDONLY)
- or bsd::err(1, "can't read packing list for $port");
- while (<FILE>) {
- chomp();
- s{\%\%(\w+)\%\%}{exists($plist_sub{$1}) ? $plist_sub{$1} : "%%$1%%"}eg;
- $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
- } elsif (m/^\@(un)?exec\s+/) {
- # ignore
- } else {
- bsd::warnx("unrecognized plist directive: %s", $_);
- }
- 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");
-}
-
-#
-# Compare two package names to determine which is newer
-#
-sub cmp_version($$) {
- my $inst = shift; # Installed package
- my $port = shift; # Newest version
-
- # Shortcut
- if ($inst eq $port) {
- return '=';
- }
-
- # Compare port epochs
- my ($inst_epoch, $port_epoch) = (0, 0);
- $inst =~ s/,(\d+)$//
- and $inst_epoch = $1;
- $port =~ s/,(\d+)$//
- and $port_epoch = $1;
- if ($inst_epoch != $port_epoch) {
- return ($inst_epoch > $port_epoch) ? '>' : '<';
- }
-
- # Split it into components
- my @a = split(/[\._-]/, $inst);
- my @b = split(/[\._-]/, $port);
-
- # Compare the components one by one
- while (@a && @b) {
- ($a, $b) = (shift(@a), shift(@b));
- next if $a eq $b;
- if ($a =~ m/^\d+$/ && $b =~ m/^\d+$/) {
- return ($a > $b) ? '>' : '<';
- }
- return ($a gt $b) ? '>' : '<';
- }
-
- # Anything left?
- if (@a) {
- return '>';
- } elsif (@b) {
- return '<';
- }
- return '=';
-}
-
-#
-# Show port status
-#
-sub show_port_status($) {
- my $port = shift; # Port to show status for
-
- my $cmp; # Comparator
-
- if ($installed{$port}) {
- foreach my $pkg (@{$installed{$port}}) {
- if (-d "$portsdir/$port") {
- $cmp = cmp_version($pkg, $pkgname{$port});
- } else {
- $cmp = '?';
- }
- if ($cmp eq '=') {
- print(" $pkg\n");
- } else {
- printf(" $cmp $pkg ($pkgname{$port})\n");
- }
- }
- } else {
- printf(" ! $port\n");
- }
-}
-
-#
-# Clean a port
-#
-sub clean_port($) {
- my $port = shift; # Port to clean
-
- setproctitle("cleaning $port");
- make($port, "clean")
- or bsd::warnx("failed to clean %s", $port);
- setproctitle();
-}
-
-#
-# 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
-
- setproctitle("fetching $port");
- make($port, "checksum")
- or bsd::errx(1, "failed to fetch %s", $port);
- setproctitle();
-}
-
-#
-# Build a port
-#
-sub build_port($) {
- my $port = shift; # Port to build
-
- my @makeargs; # Arguments to make()
-
- if ($packages) {
- push(@makeargs, "package");
- push(@makeargs, "DEPENDS_TARGET=package");
- } else {
- push(@makeargs, "install");
- }
- if ($force) {
- push(@makeargs, "-DFORCE_PKG_REGISTER");
- }
- if (!$dontclean) {
- push(@makeargs, "clean");
- push(@makeargs, "DEPENDS_CLEAN=YES");
- }
- setproctitle("building $port");
- if (!make($port, @makeargs)) {
- bsd::errx(1, "failed to %s %s",
- $packages ? "package" : "build", $port);
- }
- setproctitle();
-}
-
-#
-# Print usage message and exit
-#
-sub usage() {
- stderr("Usage: porteasy [-abCceFfhIikLlsuVvw] [-D date] [-d dir]\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, --dontclean Don't clean after build
- -c, --clean Clean the specified ports
- -e, --exclude-installed Exclude installed ports
- -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
- -R, --use-rsh Force use of rsh for cvs :ext: method
- -S, --use-ssh Force use of ssh for cvs :ext: method
- -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
- -w, --website Show the URL to the port's website
-
-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 $requested = 0; # Number of ports on command line
-
- setproctitle();
-
- # Show usage if no arguments were specified on the command line
- if (!@ARGV) {
- usage();
- }
-
- # Get option defaults
- if ($ENV{'PORTEASY_OPTIONS'}) {
- foreach (split(' ', $ENV{'PORTEASY_OPTIONS'})) {
- unshift(@ARGV, $_);
- }
- }
-
- # Environment overrides default
- if ($ENV{'PORTSDIR'}) {
- $portsdir = $ENV{'PORTSDIR'};
- }
-
- # 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|installed" => \$installed,
- "i|info" => \$info,
- "k|packages" => \$packages,
- "L|plist" => \$plist,
- "l|list" => \$list,
- "p|portsdir=s" => \$portsdir,
- "R|use-rsh" => sub { $ENV{'CVS_RSH'} = &PATH_RSH },
- "r|cvsroot=s" => \$cvsroot,
- "S|use-ssh" => sub { $ENV{'CVS_RSH'} = &PATH_SSH },
- "s|status" => \$status,
- "t|tag=s" => \$tag,
- "u|update" => \$update,
- "V|version" => \&version,
- "v|verbose" => \$verbose,
- "w|website" => \$website,
- "x|ecks" => \&ecks,
- )
- or usage();
-
- if (!@ARGV && !$installed &&
- ($build || $fetch || $list || $packages || $plist || $website)) {
- usage();
- }
-
- if ($portsdir !~ m/^\//) {
- $portsdir = `pwd` . $portsdir;
- $portsdir =~ s/\n/\//s;
- }
-
- if ($portsdir !~ m/\/ports\/?$/) {
- bsd::errx(1, "ports directory must be named 'ports'");
- }
-
- # 'package' implies 'build'
- if ($packages) {
- $build = 1;
- }
-
- # Set and check CVS root
- if ($anoncvs && !$cvsroot) {
- $ENV{'CVS_RSH'} = &PATH_SSH;
- $cvsroot = &ANONCVS_ROOT;
- }
- if (!$cvsroot) {
- $cvsroot = $ENV{'CVSROOT'};
- }
- if (!$cvsroot && -f "$portsdir/CVS/Root") {
- local *FILE;
-
- if (sysopen(FILE, "$portsdir/CVS/Root", O_RDONLY)) {
- $cvsroot = <FILE>;
- chomp($cvsroot);
- close(FILE);
- }
- }
- if ($update && !$cvsroot) {
- bsd::errx(1, "No CVS root, please use the -r option or set \$CVSROOT");
- }
-
- # Unset potentially troublesom environment variables
- foreach my $var (sort(keys(%ENV))) {
- if ($var =~ m/^(CLASSPATH|(LD|USE|JAVA|WANT)_\w+)$/) {
- bsd::warnx("Removing $var from environment");
- delete($ENV{$var});
- }
- }
-
- # Step 1: update the ports tree infrastructure
- $release = `uname -r`;
- update_root();
-
- # Step 2: build list of explicitly required ports
- foreach my $arg (@ARGV) {
- if ($arg =~ m/^(?:-D)?([A-Z0-9_]+)=(.*)$/) {
- $ENV{$1} = $2;
- } elsif ($arg =~ m/^-D([A-Z0-9_]+)$/) {
- $ENV{$1} = '';
- } else {
- $err += add_port($arg, &REQ_EXPLICIT);
- ++$requested;
- }
- }
- if ($err) {
- bsd::errx(1, "some required ports were not found.");
- }
- if ($installed || $status || $exclude) {
- get_installed();
- }
- if ($installed || ($status && $requested == 0)) {
- foreach $port (keys(%installed)) {
- add_port($port, &REQ_EXPLICIT);
- }
- }
-
- # Step 3: update port directories and discover dependencies
- $need_deps = ($update || $fetch || $list);
- update_ports_tree(keys(%reqd));
-
- # Step 4: deselect ports which are already installed
- if ($exclude) {
- foreach $port (keys(%reqd)) {
- if (defined($installed{$port})) {
- info("$port is already installed");
- delete $reqd{$port};
- }
- }
- }
-
- # Step 5: list selected ports
- if ($list) {
- foreach $port (sort(keys(%reqd))) {
- print((($reqd{$port} & &REQ_EXPLICIT) ? " * " : " "),
- "$port ($pkgname{$port})\n");
- }
- }
-
- # Step 6: list installed ports
- if ($status) {
- foreach $port (sort({ $pkgname{$a} cmp $pkgname{$b} } keys(%reqd))) {
- show_port_status($port);
- }
- }
-
- # Step 7: show info
- if ($info) {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- show_port_info($port);
- }
- }
- }
-
- # Step 8: show packing list
- if ($plist) {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- show_port_plist($port);
- }
- }
- }
-
- # Step 9: show website URL
- if ($website) {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- show_port_website($port);
- }
- }
- }
-
- # Step A: clean the ports directories (or the entire tree)
- if ($clean) {
- if (!$requested) {
- clean_tree();
- } else {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- clean_port($port);
- }
- }
- }
- }
-
- # Step B: fetch distfiles
- if ($fetch) {
- foreach $port (keys(%reqd)) {
- fetch_port($port);
- }
- }
-
- # 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)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- build_port($port);
- }
- }
- }
-
- # Done!
- exit(0);
-}