aboutsummaryrefslogtreecommitdiffstats
path: root/devel/pinstall/src
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2000-10-21 22:40:55 +0800
committerdes <des@FreeBSD.org>2000-10-21 22:40:55 +0800
commitd520ae12192d6360db3db85ad51764fb5983f53b (patch)
treefdbcf3095f4d9ae5930082eee4e3d3b6e43ea266 /devel/pinstall/src
parent4d0b9151a441805d434206411a089e0fe3dbe3fc (diff)
downloadfreebsd-ports-gnome-d520ae12192d6360db3db85ad51764fb5983f53b.tar.gz
freebsd-ports-gnome-d520ae12192d6360db3db85ad51764fb5983f53b.tar.zst
freebsd-ports-gnome-d520ae12192d6360db3db85ad51764fb5983f53b.zip
Simple tool that parses a plist and copies the directories and files listed
within to a specified destination (defaulting to ${PREFIX}).
Diffstat (limited to 'devel/pinstall/src')
-rw-r--r--devel/pinstall/src/pinstall.pl187
1 files changed, 187 insertions, 0 deletions
diff --git a/devel/pinstall/src/pinstall.pl b/devel/pinstall/src/pinstall.pl
new file mode 100644
index 000000000000..188c35f59fe1
--- /dev/null
+++ b/devel/pinstall/src/pinstall.pl
@@ -0,0 +1,187 @@
+#!/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.
+#
+# $Id$
+#
+
+use strict;
+use Fcntl;
+use POSIX qw(EEXIST);
+use Getopt::Long;
+
+my $VERSION = "1.0";
+
+# Global parameters
+my $plist; # Packing list
+my $prefix; # Installation prefix
+my $srcdir; # Source directory
+
+# Global flags
+my $verbose; # Verbose flag
+
+#
+# Install a directory
+#
+sub install_dir($) {
+ my $dn = shift; # Directory name
+
+ my @sb; # File status
+
+ if ($verbose) {
+ print(STDERR "Creating directory $prefix/$dn\n");
+ }
+ if (!(@sb = stat("$srcdir/$dn"))) {
+ die("stat('$dn'): $!\n");
+ }
+ if (!mkdir("$prefix/$dn", 0755) && $! != EEXIST) {
+ die("mkdir('$prefix/$dn'): $!\n");
+ }
+ if (!chmod($sb[2] & 07777, "$prefix/$dn")) {
+ die("chmod('$prefix/$dn'): $!\n");
+ }
+ if (!chown($sb[4], $sb[5], "$prefix/$dn")) {
+ die("chown('$prefix/$dn'): $!\n");
+ }
+}
+
+#
+# Install a file
+#
+sub install_file($) {
+ my $fn = shift; # Filename
+
+ my @sb; # File status
+
+ if ($verbose) {
+ print(STDERR "Installing $fn as $prefix/$fn\n");
+ }
+ if (!(@sb = stat("$srcdir/$fn"))) {
+ die("stat('$fn'): $!\n");
+ }
+ if (system("install", "-c", "-m", sprintf("0%o", $sb[2] & 07777),
+ "-o", $sb[4], "-g", $sb[5], "$srcdir/$fn", "$prefix/$fn")) {
+ die("install('$fn'): failed\n");
+ }
+}
+
+#
+# Print usage message and exit
+#
+sub usage() {
+
+ print(STDERR "Usage: pinstall [-hv] [-d srcdir] [-f plist] [-p prefix]\n");
+ exit(1);
+}
+
+#
+# Print help text
+#
+sub help() {
+
+ print(STDERR "pinstall $VERSION
+Copyright (c) 2000 Dag-Erling Smørgrav. All rights reserved.
+
+Options:
+ -h, --help Show this information
+ -v, --verbose Verbose mode
+
+Parameters:
+ -d, --srcdir=DIR Specify source directory
+ -f, --plist=FILE Specify packing list
+ -p, --prefix=DIR Specify installation prefix
+
+Report bugs to <des\@freebsd.org>.
+");
+ exit(1);
+}
+
+MAIN:{
+ local *PLIST; # File handle
+ my @dirs; # Directories
+ my @files; # Files
+ my $item; # Iterator
+
+ # Scan command line options
+ (Getopt::Long::Configure("auto_abbrev", "bundling"));
+ GetOptions(
+ "d|src-dir=s" => \$srcdir,
+ "f|plist=s" => \$plist,
+ "h|help" => \&help,
+ "p|prefix=s" => \$prefix,
+ "v|verbose" => \$verbose,
+ )
+ or usage();
+
+ # Check prefix
+ if (!$prefix) {
+ $prefix = $ENV{'PREFIX'} || "/usr/local";
+ }
+ $prefix =~ s|/*$||;
+ if ($prefix !~ m|^/|) {
+ die("Invalid prefix\n");
+ }
+
+ # Check packing list
+ if (!$plist) {
+ $plist = "pkg-plist";
+ }
+ if (!-f $plist) {
+ die("No packing list\n");
+ }
+
+ # Check source directory
+ if (!$srcdir || !-d $srcdir) {
+ die("No source directory\n");
+ }
+
+ # Read plist
+ sysopen(PLIST, $plist, O_RDONLY)
+ or die("open(): $!\n");
+ while (<PLIST>) {
+ chomp();
+ if (m/^([a-z]\S+)\s*$/) {
+ push(@files, $1);
+ } elsif (m/^\@dirrm\s+(\S+)\s*$/) {
+ push(@dirs, $1);
+ } else {
+ warn("Unrecognized directive: $_\n");
+ }
+ }
+ close(PLIST)
+ or die("close(): $!\n");
+
+ # Create directories
+ foreach $item (sort(@dirs)) {
+ install_dir($item);
+ }
+
+ # Copy files
+ foreach $item (sort(@files)) {
+ install_file($item);
+ }
+}