1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
#!/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
# however feel free to submit patches to will@FreeBSD.org. =)
#
use Getopt::Std;
use vars qw/ $opt_d $opt_h $opt_n $opt_u $opt_t $opt_v /;
use strict;
getopts('d:h:ntu:v');
my $dir = $opt_d;
my $h = "freefall.FreeBSD.org";
$h = $opt_h if ($opt_h ne "");
my $n = $opt_n;
my $u = $ENV{USER};
$u = $opt_u if ($opt_u ne "");
my $more_testing = $opt_t;
my $vanilla = $opt_v;
my $portname = $opt_d;
my $tmpdir;
my $pwd;
my $repo;
my $ssh;
if( !defined $ENV{"CVS_RSH"} ) {
$ENV{CVS_RSH} = "ssh";
}
my $make = "make";
my $portlint = "portlint -N -a -c";
my $perl = "perl";
my $cp = "cp";
my $mv = "mv";
my $rm = "rm";
my $category;
# now check to make sure this isn't running on freefall
chomp(my $myhost = lc(`hostname`));
if ($myhost ne lc($h)) {
$ssh = "$ENV{CVS_RSH} $u\@$h";
$repo = "$u\@$h:/home/ncvs";
} else {
$ssh = "";
$repo = "/home/ncvs";
}
my $cvs = "cvs -d $repo";
sub usage {
#addport,v \$Revision: 1.5 $
print <<EOF;
authors: <will\@FreeBSD.org>, <mharo\@FreeBSD.org>
SYNOPSIS
$0 [-h host] [-u user] [-ntv] -d directory
Where directory is the root directory containing the new port
that you wish to add to the Ports Collection.
OPTIONS
-h host Use a cvshost besides freefall.FreeBSD.org
-n Do not actually commit anything.
-u user Use a different username (default: $u).
-t Do more port testing
-v Plain vanilla "add it" - no testing at all.
This option overrides -t. It is currently
necessary in order to use this on freefall.
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 "") {
warnx("Please specify a directory to import a new port from.");
usage();
exit 1;
}
$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 && !$vanilla) {
my @commands = split(/\n/, <<EOF);
$make distclean
$make build
EOF
for (@commands) {
system("$_") && errx(1, "'$_' had problems. aborting.");
}
}
# commands to run before adding port
if (!$vanilla) {
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
|