summaryrefslogtreecommitdiff
path: root/Tools
diff options
context:
space:
mode:
authorMichael Haro <mharo@FreeBSD.org>2000-05-01 19:47:14 +0000
committerMichael Haro <mharo@FreeBSD.org>2000-05-01 19:47:14 +0000
commit8ec236463700f8f60529e1ed213b21c2abb3ad2b (patch)
tree882132b5d4060763e7a97d5123fce1d1db93a125 /Tools
parentA tool to check whether all your ports are installed properly, what files (diff)
Future replacement to easy-import for adding ports to the tree.
This still needs work, but I want to get this out there so people can comment on it. This is really only of use to committers.
Notes
Notes: svn path=/head/; revision=28244
Diffstat (limited to 'Tools')
-rwxr-xr-xTools/scripts/addport243
1 files changed, 243 insertions, 0 deletions
diff --git a/Tools/scripts/addport b/Tools/scripts/addport
new file mode 100755
index 000000000000..45152e03c1e1
--- /dev/null
+++ b/Tools/scripts/addport
@@ -0,0 +1,243 @@
+#!/usr/bin/perl
+#
+# addport - perl script that adds new ports to the
+# FreeBSD Ports Collection.
+# Created by: Will Andrews <will@FreeBSD.org>
+# and Michael Haro <mharo@FreeBSD.org>
+#
+# $Id: addport,v 1.5 2000/04/22 22:19:43 mharo Exp $
+# $FreeBSD$
+#
+# MAINTAINER= mharo@FreeBSD.org
+#
+
+use Getopt::Std;
+use vars qw/ $opt_d $opt_h $opt_l $opt_n $opt_r $opt_u $opt_t /;
+use strict;
+
+getopts('c:d:h:l:nrtu:');
+
+my $dir = $opt_d;
+my $h = "freefall.FreeBSD.org";
+$h = $opt_h if ($opt_h ne "");
+my $n = $opt_n;
+my $use_rsh = $opt_r;
+my $u = $ENV{USER};
+$u = $opt_u if ($opt_u ne "");
+my $more_testing = $opt_t;
+my $portname = $opt_d;
+
+my $tmpdir;
+my $pwd;
+my $repo = "$u\@$h:/home/ncvs";
+my $ssh = "ssh $u\@$h";
+$ENV{CVS_RSH} = "ssh";
+my $cvs = "cvs -d $repo";
+my $make = "make";
+my $portlint = "portlint -N -a -c";
+my $perl = "perl";
+my $cp = "cp";
+my $mv = "mv";
+my $rm = "rm";
+
+my $category;
+
+# enough with the global vars
+
+sub usage {
+#addport,v \$Revision: 1.5 $
+print <<EOF;
+authors: <will\@FreeBSD.org>, <mharo\@FreeBSD.org>
+
+SYNOPSIS
+ $0 [-u user] [-h host] [-nrt] -d directory
+
+ Where directory is the root directory containing the new port
+ that you wish to add to the Ports Collection.
+
+OPTIONS
+ -l repo Use a local repository as necessary.
+ -n Do not actually commit anything.
+ -r Use rsh(1) instead of ssh(1) for committing.
+ Note: This will not work on *.FreeBSD.org.
+ -u user Use a different username (default: $u).
+ -t Do more port testing
+
+EOF
+}
+
+sub warnx {
+ my ($msg) = @_;
+ print STDERR $0 . ": " . $msg . "\n";
+}
+
+
+sub err {
+ my ($ex, $msg) = @_;
+
+ warnx("WARNING: err called incorrectly") if (($ex !~ m/^\d+/) || ($msg eq ""));
+ print STDERR $0 . ": " . $msg . ": $!\n";
+ exit $ex;
+}
+
+sub errx {
+ my ($ex,$msg) = @_;
+
+ warnx("WARNING: errx called incorrectly") if (($ex !~ m/^\d+/) || ($msg eq ""));
+ print STDERR $0 . ": " . $msg . "\n";
+ exit $ex;
+}
+
+sub prompt {
+ my ($msg) = @_;
+
+ print "$msg:\n";
+ while(1) {
+ print "Continue? ";
+ my $reply = <>;
+ return 0 if ($reply =~ m/^[Yy]/);
+ return 1 if ($reply =~ m/^[Nn]/);
+ }
+
+}
+
+sub contains {
+ # look if the first parameter is contained in the list following it
+ my($item, @list) = @_;
+
+ foreach my $i (@list) {
+ return 1 if $i eq $item;
+ }
+ return 0;
+}
+
+sub lsports {
+ my @rv = ();
+
+ open(F, "Makefile") || die "can't open Makefile: $!";
+ while(<F>) {
+ chomp;
+ chomp;
+ next if $_ !~ m/SUBDIR/;
+ s/^[ \t]+SUBDIR[ \t]+\+?=[\ \t]+//;
+ push(@rv, $_);
+ }
+ close(F);
+
+ return @rv;
+}
+
+
+# stuff that always happens when we start
+BEGIN {
+ $tmpdir=`mktemp -d -t ap`;
+ chomp $tmpdir;
+ if ($tmpdir eq "") {
+ errx(1,"making random tmpdir didn't work, aborting.");
+ }
+ $pwd = `pwd`;
+ chomp $pwd;
+ chdir $tmpdir or err(1,"$tmpdir");
+}
+
+# stuff that always happens when we exit
+END {
+ # only remove $tmpdir if it points to something in /tmp
+ # this is a silly little security thing
+ if (defined($rm) && defined($tmpdir)) {
+ system("$rm -rf $tmpdir") if ($tmpdir =~ m,/tmp/,);
+ }
+}
+
+
+if ($dir eq "") {
+ errx(1, "Please specify a directory to import a new port from.");
+}
+
+$dir = "$pwd/$dir" if ($dir !~ m,^/,);
+$dir =~ s,/$,,g;
+
+if (! -d "$dir") {
+ errx(1,"$dir is either not a directory or does not exist");
+}
+
+chdir $dir or err(1, "$dir");
+
+if ($more_testing) {
+my @commands = split(/\n/, <<EOF);
+$make distclean
+$make build
+EOF
+for (@commands) {
+ system("$_") && errx(1, "'$_' had problems. aborting.");
+}
+}
+# commands to run before adding port
+my @commands = split(/\n/, <<EOF);
+$make clean
+$make check-categories
+$portlint
+$make FETCH_BEFORE_ARGS="-btsA" checksum
+EOF
+for (@commands) {
+ system("$_") && errx(1, "'$_' had problems. aborting.");
+}
+
+$_ = `grep CATEGORIES Makefile`;
+m/\w+\W+([\w-]+)/;
+$category = $1;
+
+prompt("Adding port to $category.") && errx(1, "user abort requested");
+
+chdir $tmpdir or err(1,"$tmpdir");
+
+my $cvs_category = $category;
+$cvs_category =~ s/-/_/g;
+system("$cvs co -l ports_$cvs_category") && errx(1, "can't get temporary category directory, aborting.");
+system("$mv ports_$cvs_category $category");
+chdir $category or err(1,"$category");
+system("$cp -PRp $dir .");
+
+system("$cvs add `find $portname -type d | grep -v CVS`") && errx(1, "cvs add for dirs failed, aborting.");
+system("$cvs add `find $portname -type f | grep -v CVS`") && errx(1, "cvs add for files failed, aborting.");
+
+my @ports = &lsports;
+
+if (&contains($portname, @ports)) {
+ print "Error: $portname already exists in $category\'s Makefile\n";
+ &goodbye(1);
+}
+
+my $port = "";
+foreach my $tmp (sort(@ports)) {
+ if ($tmp gt $portname) {
+ $port = $tmp;
+ last;
+ }
+}
+
+my $cmd;
+if ($port eq "") {
+ # we are going to append our port
+ $cmd = "\$\na\n";
+} else {
+ # we can insert it
+ $cmd = "/^ SUBDIR += $port/\ni\n";
+}
+
+print "Inserting new port into $category/Makefile...\n";
+open(ED, "|ed Makefile") || die "Cannot start ed\n";
+print ED "$cmd SUBDIR += $portname\n.\nw\nq\n";
+close(ED);
+
+chdir $tmpdir or err(1,"$tmpdir");
+
+system("$cvs ci") && errx(1, "cvs commit failed, aborting.");
+
+system("$ssh $perl ~mharo/bin/modulesupdate $portname ports/$category/$portname") && errx(1, "adding port to modules or category Makefile failed, aborting.");
+
+print <<EOF;
+You're done! The new port $portname has been completely imported in
+the tree. Don't forget to add the creator's name and email address to
+the Contributors' List if they are not already there.
+EOF