1#!/usr/bin/perl -w
2#
3# Copyright (c) 2000 Neil Blakey-Milner
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27
28# a script to gain a bit of knowledge about a supplied distfile
29
30use strict;
31use vars qw/ $opt_n /;
32
33use File::Basename qw( basename dirname );
34use Getopt::Std qw( getopts );
35
36my ($filename, $ver, $initdir, $distdir, $wrkdir, $tmpdir);
37my ($makefile, $wrksrc);
38my (%cap);
39
40chomp($initdir = `pwd`);
41
42$cap{"MAINTAINER"} = ($ENV{"MAINTAINER"} || $ENV{"PKGMAINTAINER"} || "ports\@freebsd.org");
43
44getopts('n');
45
46&usage if $#ARGV != 0;
47
48$filename = $ARGV[0];
49
50if ($filename =~ m#^(f|ht)tp\://#) {
51	print `fetch $filename`;
52	$cap{"MASTER_SITES"} = dirname($filename) . '/';
53	$filename = basename($filename);
54}
55chdir(dirname($filename));
56chomp($distdir = `pwd`);
57chdir ($initdir);
58
59&chk_extract; # .tar.gz vs .tgz vs .tar.bz2, &c.
60&enh_distname;
61if ($opt_n) {
62	print "filename is $filename\n";
63	print "PORTNAME is " . $cap{"PORTNAME"} . "\n";
64	print "PORTVERSION is " . $cap{"PORTVERSION"} . "\n";
65	exit;
66}
67&bareskel;
68&md5;
69&writemk;
70
71exit;
72
73sub bareskel {
74	$tmpdir = $cap{'PORTNAME'};
75	$tmpdir .= ".$$" while -e $tmpdir;
76	mkdir($tmpdir,0777);
77
78	`printf "\n" > $tmpdir/pkg-plist`;
79	`printf "\n" > $tmpdir/pkg-descr`;
80}
81
82sub writemk {
83
84	my (%tmp);
85	my ($key);
86
87	my ($distname);
88	$distname = $cap{"PORTNAME"};
89
90	foreach $key (keys %cap) {
91		$tmp{$key} = $cap{$key};
92	}
93
94	open(MAKEFILE, ">$tmpdir/Makefile");
95	my ($date);
96	chomp($date = `date +"\%d \%b \%Y"`);
97
98	print MAKEFILE <<EOF;
99# New ports collection makefile for: $distname
100# Date created:		$date
101# Whom:			makeport.pl
102#
103# \$FreeBSD\$
104#
105
106EOF
107
108	print MAKEFILE "PORTNAME=	" . $tmp{"PORTNAME"} . "\n";
109	print MAKEFILE "PORTVERSION=	" . $tmp{"PORTVERSION"} . "\n";
110	delete($tmp{"PORTNAME"});
111	delete($tmp{"PORTVERSION"});
112
113	print MAKEFILE "CATEGORIES=	misc\n";
114	foreach $key (keys %tmp) {
115		my($tmp) = $tmp{$key};
116		if (($key eq "DISTNAME") || ($key eq "EXTRACT_SUFX")) {
117			print MAKEFILE "$key=\t$tmp\n";
118			delete($tmp{$key});
119		}
120	}
121
122	if ($tmp{"MASTER_SITES"}) {
123		print MAKEFILE "MASTER_SITES= 	". $tmp{"MASTER_SITES"} . "\n\n";
124		delete($tmp{"MASTER_SITES"});
125	}
126
127	print MAKEFILE "\nMAINTAINER=\t" . $tmp{"MAINTAINER"} . "\n";
128	delete($tmp{"MAINTAINER"});
129	print MAKEFILE "COMMENT=\t" . "A" . "\n\n";
130
131	if ($tmp{"LIB_DEPENDS"}) {
132		print MAKEFILE "LIB_DEPENDS=". $tmp{"LIB_DEPENDS"} . "\n\n";
133		delete($tmp{"LIB_DEPENDS"});
134	}
135
136	#second group
137	foreach $key (keys %tmp) {
138		my($tmp) = $tmp{$key};
139		print MAKEFILE "$key=\t$tmp\n";
140	}
141
142	print MAKEFILE "# -- eos --\n\n";
143
144	print MAKEFILE ".include <bsd.port.mk>\n";
145	close (MAKEFILE);
146}
147
148sub md5 {
149	my $tmp = basename($filename);
150	chdir ($initdir);
151	`md5 $filename | perl -pe "s#$filename#$tmp#" > $tmpdir/distinfo`;
152}
153
154sub chk_extract {
155	my $tmp = basename($filename);
156
157	$tmp =~ s/(\.tgz)$// && do {
158		$cap{"DISTNAME"} = $tmp;
159		$cap{"EXTRACT_SUFX"} = $1;
160		return;
161	};
162	$tmp =~ s/(\.tar\.bz2)$// && do {
163		$cap{"DISTNAME"} = $tmp;
164		$cap{"EXTRACT_SUFX"} = $1 if ($1 ne ".tar.bz2");
165		$cap{"USE_BZIP2"} = "YES";
166		return;
167	};
168	$tmp =~ s/(\.tar)$// && do {
169		$cap{"DISTNAME"} = $tmp;
170		$cap{"EXTRACT_SUFX"} = $1;
171		return;
172	};
173	$tmp =~ s/(\.tar.*)$// && do {
174		$cap{"DISTNAME"} = $tmp;
175		$cap{"EXTRACT_SUFX"} = $1 if ($1 ne ".tar.gz");
176		return;
177	};
178}
179
180sub add_extsuffix {
181	return if $cap{"EXTRACT_SUFX"};
182	if ($cap{"USE_BZIP2"}) {
183		$cap{"EXTRACT_SUFX"} = ".tar.bz2";
184	} else {
185		$cap{"EXTRACT_SUFX"} = ".tar.gz";
186	}
187}
188
189sub enh_distname {
190	my($changes) = 0;
191	my($play) = $cap{"DISTNAME"};
192	#print "starting play...\n";
193	my($firstshot) = 0;
194	my($portname, $portversion);
195	if (defined($play) eq "") {
196		die "can't make heads or tails of $filename";
197	}
198	while ($changes == 0) {
199		$changes = 1;
200		$firstshot++;
201		$_ = $play;
202		#print "using $play\n";
203		/^(.*[0-9][a-z]?)([-._][a-z]*)$/i && do {
204			print "Door #1\n";
205			$cap{"DISTNAME"} = $1;
206			$play = $1;
207			&add_extsuffix;
208			$cap{"EXTRACT_SUFX"} = $2 . $cap{"EXTRACT_SUFX"};
209			$changes = 0;
210			next;
211		};
212		/^([a-z]*)([0-9]+)([-._])([0-9]+([-._]).*)$/i && do {
213			print "Door #2\n";
214			if ($5 eq $3) {
215				$play = "$1-$2.$4";
216				#$cap{"PORTNAME"} = $1;
217				#$cap{"PORTVERSION"} = "$2.$4";
218				$portname = $1;
219				$portversion = "$2.$4";
220				$changes = 0;
221				next;
222			}
223		};
224		/^(.*?[^-._])([0-9])([-._])([^v]?[0-9]*[a-z]*)([-._]?)(.*)$/i &&( $firstshot == 1) && do {
225			print "Door #4\n";
226			if (($5 eq $3) || ($5 eq "")) {
227				#$cap{"PORTNAME"} = $1;
228				#$cap{"PORTVERSION"} = "$2$3$4$5$6";
229				$portname = $1;
230				$portversion = "$2$3$4$5$6";
231				next;
232			}
233		};
234		/^(.*?)([-._])(v?)((?:[0-9][-._])*[0-9][a-z]?.*)$/i && do {
235			print "Door #3\n";
236			my($tmp);
237			$tmp = $1;
238			$ver = "$4";
239			if ($ver =~ /^(.*)([-._])([0-9]?)([a-z])[a-z]+([0-9]?)$/) {
240				print "Door #3.1\n";
241				my($foo) = "";
242				#print "1 - $1\n";
243				#print "2 - $2\n";
244				#print "3 - $3\n";
245				#print "4 - $4\n";
246				#print "5 - $5\n";
247				$foo = "." if $2;
248				#$ver = "$1$foo$3$4$5";
249				$ver = "$1$foo$3$4$5";
250			}
251			$portname = $tmp;
252			$portversion = $ver;
253			next;
254		};
255	}
256
257	if (defined($portversion) eq "") {
258		die "can't make heads or tails of $filename";
259	}
260
261	$portversion =~ s/_/./g;
262	$portversion =~ s/-/./g;
263
264	$cap{"PORTNAME"} = $portname;
265	$cap{"PORTVERSION"} = $portversion;
266
267	my ($temp1);
268	my ($temp2);
269
270	$temp1 = $cap{"DISTNAME"};
271	$temp2 = $cap{"PORTNAME"} . "-" . $cap{"PORTVERSION"};
272
273	if ($temp1 eq $temp2) {
274		delete($cap{"DISTNAME"});
275	}
276}
277
278sub usage {
279	print STDERR <<"EOF";
280usage: $0 filename
281
282	generates a ports skeleton for port based on filename
283
284EOF
285	exit;
286}
287