Wed Aug 31 21:15:01 2016 UTC ()
Indent.


(wiz)
diff -r1.2 -r1.3 pkgsrc/pkgtools/pkg_notify/files/pkg_notify

cvs diff -r1.2 -r1.3 pkgsrc/pkgtools/pkg_notify/files/pkg_notify (expand / switch to unified diff)

--- pkgsrc/pkgtools/pkg_notify/files/pkg_notify 2014/02/02 10:19:41 1.2
+++ pkgsrc/pkgtools/pkg_notify/files/pkg_notify 2016/08/31 21:15:01 1.3
@@ -6,27 +6,27 @@ @@ -6,27 +6,27 @@
6# 6#
7# Create the /usr/pkg/etc/pkg_notify.list file containing the package list 7# Create the /usr/pkg/etc/pkg_notify.list file containing the package list
8# you want to be informed on, following this format : 8# you want to be informed on, following this format :
9# 9#
10# $ cat /usr/pkg/etc/pkg_notify.list 10# $ cat /usr/pkg/etc/pkg_notify.list
11# wip/foo 11# wip/foo
12# net/bar 12# net/bar
13# www/foobar-devel 13# www/foobar-devel
14# 14#
15# OR invoke pkg_notify with the package following : 15# OR invoke pkg_notify with the package following :
16# 16#
17# $ pkg_notify category/package 17# $ pkg_notify category/package
18# 18#
19# $Id: pkg_notify,v 1.2 2014/02/02 10:19:41 wiz Exp $ 19# $Id: pkg_notify,v 1.3 2016/08/31 21:15:01 wiz Exp $
20 20
21use Net::FTP; 21use Net::FTP;
22use LWP::UserAgent; 22use LWP::UserAgent;
23use HTTP::Request::Common; 23use HTTP::Request::Common;
24use Getopt::Std; 24use Getopt::Std;
25 25
26use strict; 26use strict;
27 27
28# those three are replaced by Makefile 28# those three are replaced by Makefile
29my $make = "@MAKE@"; 29my $make = "@MAKE@";
30my $pkgsrcbase = "@PKGSRCDIR@"; 30my $pkgsrcbase = "@PKGSRCDIR@";
31my $localbase = "@PREFIX@"; 31my $localbase = "@PREFIX@";
32 32
@@ -55,614 +55,614 @@ my $subvers = ""; @@ -55,614 +55,614 @@ my $subvers = "";
55# create an alpha to num mapping 55# create an alpha to num mapping
56my %alnum = map { $_ => ord($_) - ord('a') + 1 } ('a' .. 'z'); 56my %alnum = map { $_ => ord($_) - ord('a') + 1 } ('a' .. 'z');
57 57
58sub dot_strip { 58sub dot_strip {
59 my $out = $_[0]; 59 my $out = $_[0];
60 # clean extremities from dots 60 # clean extremities from dots
61 $out =~ s/^[\.\-_]+//; 61 $out =~ s/^[\.\-_]+//;
62 $out =~ s/[\.\-_]+$//; 62 $out =~ s/[\.\-_]+$//;
63 63
64 return ($out); 64 return ($out);
65} 65}
66 66
67sub beta_strip { 67sub beta_strip {
68 my $out = $_[0]; 68 my $out = $_[0];
69 69
70 # handle beta - alpha - pre... 70 # handle beta - alpha - pre...
71 if ($out =~ /(.*[0-9])([\-\_\.]?)(pre|alpha|beta|gamma|rc)([0-9]*.*)/i) { 71 if ($out =~ /(.*[0-9])([\-\_\.]?)(pre|alpha|beta|gamma|rc)([0-9]*.*)/i) {
72 my $pre = $1; 72 my $pre = $1;
73 my $dev = lc $3; 73 my $dev = lc $3;
74 # remember real versionning 74 # remember real versionning
75 $subvers = "$2$3"; 75 $subvers = "$2$3";
76 my $post = $4; 76 my $post = $4;
77 # replace pre|alpha|beta... with equiv nums 77 # replace pre|alpha|beta... with equiv nums
78 $dev =~ s/([a-z]).*/$alnum{$1}/; 78 $dev =~ s/([a-z]).*/$alnum{$1}/;
79 $out = $pre.".00".$dev."00.".$post; 79 $out = $pre.".00".$dev."00.".$post;
80 } 80 }
81 81
82 return ($out); 82 return ($out);
83} 83}
84 84
85sub ext_strip { 85sub ext_strip {
86 # cleanup versions : 86 # cleanup versions :
87 # blah-1.2.3-blah 87 # blah-1.2.3-blah
88 # 1.2.3[.-_]pkg -> 1.2.3 88 # 1.2.3[.-_]pkg -> 1.2.3
89 # devel-1.2.3 -> 1.2.3 89 # devel-1.2.3 -> 1.2.3
90 my $out = $_[0]; 90 my $out = $_[0];
91 91
92 # version has no chars, should be fine 92 # version has no chars, should be fine
93 if ($out !~ /[a-z]/) { 93 if ($out !~ /[a-z]/) {
94 return ($out); 94 return ($out);
95 } 95 }
96 96
97 if ($out =~ /^[a-z\-\._]+([0-9\-\._]+)[a-z\-\._]+$/i) { 97 if ($out =~ /^[a-z\-\._]+([0-9\-\._]+)[a-z\-\._]+$/i) {
98 # strip (qwerty-)1.2.3(-qwerty) 98 # strip (qwerty-)1.2.3(-qwerty)
99 $out = $1; 99 $out = $1;
100 } elsif ($out =~ /^([0-9\-\._]+)[\-\._][a-z]+/i) { 100 } elsif ($out =~ /^([0-9\-\._]+)[\-\._][a-z]+/i) {
101 # strip 1.2.3(-qwerty) 101 # strip 1.2.3(-qwerty)
102 $out = $1; 102 $out = $1;
103 } elsif ($out =~ /[a-z]+[\-\._]+([0-9\-\._]+)$/i) { 103 } elsif ($out =~ /[a-z]+[\-\._]+([0-9\-\._]+)$/i) {
104 # strip (qwerty-)1.2.3 104 # strip (qwerty-)1.2.3
105 $out = $1; 105 $out = $1;
106 } 106 }
107 107
108 return ($out); 108 return ($out);
109} 109}
110 110
111sub is_beta { 111sub is_beta {
112 if ($_[0] =~ /00[0-9]+00/) { 112 if ($_[0] =~ /00[0-9]+00/) {
113 return (1); 113 return (1);
114 } 114 }
115 return (0); 115 return (0);
116} 116}
117 117
118sub find_version { 118sub find_version {
119 my @ls = @_; 119 my @ls = @_;
120 my $lastvers = ""; 120 my $lastvers = "";
121 my $realdist = ""; 121 my $realdist = "";
122 122
123 foreach (@ls) { 123 foreach (@ls) {
124 my $line = $_; 124 my $line = $_;
125 my $wasbad = 0; 125 my $wasbad = 0;
126 126
127 if ($line =~ /([^0-9a-z]$dist|^$dist)([^\/\"<>\@]+)$extract_sufx/) { 127 if ($line =~ /([^0-9a-z]$dist|^$dist)([^\/\"<>\@]+)$extract_sufx/) {
128 128
129 $realdist = $dist.$2.$extract_sufx; 129 $realdist = $dist.$2.$extract_sufx;
130 my $lsvers = $2; 130 my $lsvers = $2;
131 131
132 # replace alpha|beta|... with .0[num]0. 132 # replace alpha|beta|... with .0[num]0.
133 $lsvers = beta_strip($lsvers); 133 $lsvers = beta_strip($lsvers);
134 134
135 # strip any extension left (bin, pkg, src, devel-...) 135 # strip any extension left (bin, pkg, src, devel-...)
136 if ($nicearc) { 136 if ($nicearc) {
137 $lsvers = ext_strip($lsvers); 137 $lsvers = ext_strip($lsvers);
138 } else { 138 } else {
139 # remember archive was bad for next loop 139 # remember archive was bad for next loop
140 $wasbad = 1; 140 $wasbad = 1;
141 } 141 }
 142
 143 # with beta/alpha/... numbered, archive may be nice
 144 if (($lsvers !~ /[^0-9\.\-\_]/i) &&
 145 ($version !~ /[^0-9\.\-\_]/i)) {
 146 $nicearc = 1;
 147 }
142 148
143 # with beta/alpha/... numbered, archive may be nice 149 # replace every dot-like char (-_) with dots
144 if (($lsvers !~ /[^0-9\.\-\_]/i) &&  150 $lsvers = dot_strip($lsvers);
145 ($version !~ /[^0-9\.\-\_]/i)) { 
146 $nicearc = 1; 
147 } 
148 151
149 # replace every dot-like char (-_) with dots 152 my $display_lsvers;
150 $lsvers = dot_strip($lsvers); 153 if ($subvers ne "") {
 154 # archive has an alpha / beta / ...
 155 $display_lsvers = $lsvers;
 156 $display_lsvers =~ s/(\.00[0-9]+00)/$subvers/;
 157 $subvers = "";
 158 } else {
 159 $display_lsvers = $lsvers;
 160 }
 161
 162 # replace [-_] with dot
 163 $lsvers =~ s/[\-\_]/./g;
 164 $version =~ s/[\-\_]/./g;
 165
 166 # replace remaining chars
 167 # ex: 3.14a -> 3.14.1, i -> 9
 168 $lsvers = lc $lsvers;
 169 $lsvers =~ s/([a-z])/.$alnum{$1}/g;
 170 # numberify official version
 171 $version = lc $version;
 172 $version =~ s/([a-z])/.$alnum{$1}/g;
 173
 174 # uniq .'s
 175 $lsvers =~ s/\.+/./g;
 176 $version =~ s/\.+/./g;
 177
 178 if ($debug) {
 179 print "comparing $lsvers against $version (nicearc: $nicearc)\n";
 180 }
 181
 182 if (($lsvers ne $lastvers) && # already seen
 183 # if it's not a nicearc, do basic string comparison
 184 # if it is a nicearc, finest / int comparison
 185 (($lsvers gt $version) | $nicearc)) {
 186
 187 my $greater = 0;
 188
 189 if ($nicearc) { # nice archive, has at least major.minor
 190
 191 my @pkg_version = split(/[\.\-_]/, $version);
 192 my @ls_version = split(/[\.\-_]/, $lsvers);
 193
 194 my $i = 0;
 195 foreach (@ls_version) {
 196
 197 # package version has this member
 198 if (defined($pkg_version[$i])) {
 199
 200 my $member = $_;
 201
 202 # empty member
 203 if ($member =~ /^$/) {
 204 last;
 205 }
 206 # archive version has non-num in it, can't compare
 207 if ($member =~ /[^0-9]/) {
 208 last;
 209 }
 210 # is this member greater that pkg_version equiv ?
 211 if ($member > $pkg_version[$i]) {
 212 # if member is beta, version is >
 213 if (is_beta($member) &&
 214 !is_beta($pkg_version[$i])) {
 215 last;
 216 }
 217 $greater = 1;
 218 last;
 219 }
 220
 221 # local package has a superior version, end
 222 if ($pkg_version[$i] > $member) {
 223 # if version is beta, member is >
 224 if (!is_beta($member) &&
 225 is_beta($pkg_version[$i])) {
 226 $greater = 1;
 227 }
 228 last;
 229 }
151 230
152 my $display_lsvers; 231 } else { # package version don't have this sub-number
153 if ($subvers ne "") { 232 if (!is_beta($_)) { # avoid beta versions
154 # archive has an alpha / beta / ... 233 # aka 1.1.1beta !> 1.1.1
155 $display_lsvers = $lsvers; 234 $greater = 1;
156 $display_lsvers =~ s/(\.00[0-9]+00)/$subvers/; 235 }
157 $subvers = ""; 236 last;
158 } else { 
159 $display_lsvers = $lsvers; 
160 } 237 }
161 238
162 # replace [-_] with dot 239 $i++; # increment version member
163 $lsvers =~ s/[\-\_]/./g; 240 } # foreach
164 $version =~ s/[\-\_]/./g; 
165 
166 # replace remaining chars 
167 # ex: 3.14a -> 3.14.1, i -> 9 
168 $lsvers = lc $lsvers; 
169 $lsvers =~ s/([a-z])/.$alnum{$1}/g; 
170 # numberify official version 
171 $version = lc $version; 
172 $version =~ s/([a-z])/.$alnum{$1}/g; 
173 
174 # uniq .'s 
175 $lsvers =~ s/\.+/./g; 
176 $version =~ s/\.+/./g; 
177 
178if ($debug) { 
179 print "comparing $lsvers against $version (nicearc: $nicearc)\n"; 
180} 
181 
182 if (($lsvers ne $lastvers) && # already seen 
183 # if it's not a nicearc, do basic string comparison 
184 # if it is a nicearc, finest / int comparison 
185 (($lsvers gt $version) | $nicearc)) { 
186 
187 my $greater = 0; 
188 
189 if ($nicearc) { # nice archive, has at least major.minor 
190 
191 my @pkg_version = split(/[\.\-_]/, $version); 
192 my @ls_version = split(/[\.\-_]/, $lsvers); 
193 
194 my $i = 0; 
195 foreach (@ls_version) { 
196 
197 # package version has this member 
198 if (defined($pkg_version[$i])) { 
199 
200 my $member = $_; 
201 
202 # empty member 
203 if ($member =~ /^$/) { 
204 last; 
205 } 
206 # archive version has non-num in it, can't compare 
207 if ($member =~ /[^0-9]/) { 
208 last; 
209 } 
210 # is this member greater that pkg_version equiv ? 
211 if ($member > $pkg_version[$i]) { 
212 # if member is beta, version is > 
213 if (is_beta($member) &&  
214 !is_beta($pkg_version[$i])) { 
215 last; 
216 } 
217 $greater = 1; 
218 last; 
219 } 
220 
221 # local package has a superior version, end 
222 if ($pkg_version[$i] > $member) { 
223 # if version is beta, member is > 
224 if (!is_beta($member) && 
225 is_beta($pkg_version[$i])) { 
226 $greater = 1; 
227 } 
228 last; 
229 } 
230 
231 } else { # package version don't have this sub-number 
232 if (!is_beta($_)) { # avoid beta versions 
233 # aka 1.1.1beta !> 1.1.1 
234 $greater = 1; 
235 } 
236 last; 
237 } 
238 241
239 $i++; # increment version member 
240 } # foreach 
241 
242 } 
243 if ($nicearc == 0) { # not a nice distname 
244 $greater = 1; 
245 } 
246 # strip \'s 
247 $realdist =~ s/\\//g; 
248 if ($greater) { 
249 print "!! seems like there's a new version for $pkgname\n"; 
250 print "!! [v.$display_lsvers] - from $realdist\n"; 
251 $lastvers = $lsvers; 
252 } 
253 } 
254 } # if line /arc/ 
255 if ($wasbad) { # remember, archive was bad 
256 $nicearc = 0; 
257 } 242 }
258 } # foreach @ls 243 if ($nicearc == 0) { # not a nice distname
259 if ($lastvers eq "") { 244 $greater = 1;
260 return (0); 245 }
261 } else { 246 # strip \'s
262 return (1); 247 $realdist =~ s/\\//g;
 248 if ($greater) {
 249 print "!! seems like there's a new version for $pkgname\n";
 250 print "!! [v.$display_lsvers] - from $realdist\n";
 251 $lastvers = $lsvers;
 252 }
 253 }
 254 } # if line /arc/
 255 if ($wasbad) { # remember, archive was bad
 256 $nicearc = 0;
263 } 257 }
 258 } # foreach @ls
 259 if ($lastvers eq "") {
 260 return (0);
 261 } else {
 262 return (1);
 263 }
264} 264}
265 265
266my $ftp; 266my $ftp;
267 267
268sub ftp_connect { 268sub ftp_connect {
269 269
270 if ($ftp = Net::FTP->new($_[0], Debug => 0, Passive => 1)) { 270 if ($ftp = Net::FTP->new($_[0], Debug => 0, Passive => 1)) {
271 271
272 if ($ftp->login("anonymous",'-anonymous@')) { 272 if ($ftp->login("anonymous",'-anonymous@')) {
273 # connected 273 # connected
274 return (1); 274 return (1);
275 } else {  275 } else {
276 if ($debug) { 276 if ($debug) {
277 print "Cannot login ", $ftp->message; 277 print "Cannot login ", $ftp->message;
278 } 278 }
279 return (0); 279 return (0);
280 } 280 }
281 281
282 } else { 282 } else {
283 if ($debug) { 283 if ($debug) {
284 print "Cannot connect to site: $@\n"; 284 print "Cannot connect to site: $@\n";
285 } 
286 } 285 }
 286 }
287} 287}
288 288
289my $hadversion = 0; 289my $hadversion = 0;
290# maximum ftp recursion 290# maximum ftp recursion
291my $max_recurs = 3; 291my $max_recurs = 3;
292my $nb_recurs; 292my $nb_recurs;
293 293
294sub ftp_ls { 294sub ftp_ls {
295 295
296 my $path = $_[0]; 296 my $path = $_[0];
297 297
298 # first connection 298 # first connection
299 if (!defined($ftp)) { 299 if (!defined($ftp)) {
300 300
301 my $site = $_[0]; 301 my $site = $_[0];
302 $path = "/"; 302 $path = "/";
303 303
304 $site =~ s/(ftp:\/\/)([^\/]+)(\/?.*)/$2/; 304 $site =~ s/(ftp:\/\/)([^\/]+)(\/?.*)/$2/;
305 $path = $3; 305 $path = $3;
306 306
307 if (!ftp_connect($site)) { 307 if (!ftp_connect($site)) {
308 return (0) 308 return (0)
309 } 
310 } 309 }
 310 }
311 311
312 if ($nb_recurs > $max_recurs) { 312 if ($nb_recurs > $max_recurs) {
313 return (0); 313 return (0);
314 } else { 314 } else {
315 $nb_recurs++; 315 $nb_recurs++;
316 } 316 }
317 
318 # don't recurse to yourself 
319 if ($path =~ /\.\ ?\//) { 
320 return (0); 
321 } 
322 
323 my @list; 
324 if (my @ls = $ftp->dir($path)) { 
325 
326 foreach (@ls) { 
327 chomp; 
328  
329 my $relpath = $_; 
330 $relpath =~ s/.*[\t\ ](.+)$/$1/; 
331 
332 my $type = substr($_, 0, 1); 
333 317
334 # recurse 318 # don't recurse to yourself
335 if ($type eq 'd') { 319 if ($path =~ /\.\ ?\//) {
 320 return (0);
 321 }
336 322
337 ftp_ls("$path/$relpath"); 323 my @list;
338 # back from child directory, decrement recursion 324 if (my @ls = $ftp->dir($path)) {
339 $nb_recurs--; 
340 325
341 } else { 326 foreach (@ls) {
342 push(@list, "$relpath"); 327 chomp;
343 } 328
344 } 329 my $relpath = $_;
345 # could not cwd 330 $relpath =~ s/.*[\t\ ](.+)$/$1/;
346 } else { 331
347 if ($debug) { 332 my $type = substr($_, 0, 1);
348 print "Cannot change working directory ", $ftp->message; 333
349 } 334 # recurse
350 } 335 if ($type eq 'd') {
351 336
352 # remember when we have found something 337 ftp_ls("$path/$relpath");
353 if (find_version(@list)) { 338 # back from child directory, decrement recursion
354 $hadversion = 1; 339 $nb_recurs--;
 340
 341 } else {
 342 push(@list, "$relpath");
 343 }
355 } 344 }
 345 # could not cwd
 346 } else {
 347 if ($debug) {
 348 print "Cannot change working directory ", $ftp->message;
 349 }
 350 }
 351
 352 # remember when we have found something
 353 if (find_version(@list)) {
 354 $hadversion = 1;
 355 }
356 356
357 return ($hadversion); 357 return ($hadversion);
358} 358}
359 359
360sub http_ls { 360sub http_ls {
361 my $ua = LWP::UserAgent->new(agent => 'pkg_notify'); 361 my $ua = LWP::UserAgent->new(agent => 'pkg_notify');
362 362
363 my @page = ""; 363 my @page = "";
364 my $site = $_[0]; 364 my $site = $_[0];
365 365
366 my $headers = $ua->head($site); 366 my $headers = $ua->head($site);
367 367
368 if ($headers) { 368 if ($headers) {
369 if ($headers->content_type !~ /text/) { 369 if ($headers->content_type !~ /text/) {
370 print " * $site is a direct download !\n"; 370 print " * $site is a direct download !\n";
371 return (0); 371 return (0);
372 } 
373 } else { 
374 print " ** $site has no HTTP headers !\n"; 
375 return (0); 
376 } 372 }
 373 } else {
 374 print " ** $site has no HTTP headers !\n";
 375 return (0);
 376 }
377 377
378 my $reply = $ua->get($site); 378 my $reply = $ua->get($site);
379 
380 if ($reply->is_success) { 
381 @page = split("\n", $reply->content); 
382 379
383 if ($go_subdirs) { 380 if ($reply->is_success) {
384 $go_subdirs = 0; 381 @page = split("\n", $reply->content);
385 foreach (@page) { 
386 chomp; 
387 382
388 my $pattern = $pathvers; 383 if ($go_subdirs) {
389 $pattern =~ s/.*\/([a-z]+)[\/\.\-_0-9]+$/$1/i; 384 $go_subdirs = 0;
 385 foreach (@page) {
 386 chomp;
390 387
391 if (/$pattern/) { 388 my $pattern = $pathvers;
 389 $pattern =~ s/.*\/([a-z]+)[\/\.\-_0-9]+$/$1/i;
392 390
393 my $lsvers = $_; 391 if (/$pattern/) {
394 $lsvers =~ s/.*a\ href\=\"([^\"\ ]+?)\".*/$1/i; 
395 392
396 # both are / terminated 393 my $lsvers = $_;
397 if ($lsvers =~ /[^\/]$/) { 394 $lsvers =~ s/.*a\ href\=\"([^\"\ ]+?)\".*/$1/i;
398 $lsvers = $lsvers ."/"; 
399 } 
400 if ($pathvers =~ /[^\/]$/) { 
401 $pathvers = $pathvers ."/"; 
402 } 
403 395
404 $lsvers = "$site/$lsvers"; 396 # both are / terminated
 397 if ($lsvers =~ /[^\/]$/) {
 398 $lsvers = $lsvers ."/";
 399 }
 400 if ($pathvers =~ /[^\/]$/) {
 401 $pathvers = $pathvers ."/";
 402 }
405 403
406 if ($lsvers ge $pathvers) { 404 $lsvers = "$site/$lsvers";
407 http_ls($lsvers); 
408 } 
409 } 
410 } # foreach page 
411 } # if subdirs 
412 405
413 if (find_version(@page)) { 406 if ($lsvers ge $pathvers) {
414 return (1); 407 http_ls($lsvers);
415 } else { 408 }
416 return (0); 
417 } 409 }
 410 } # foreach page
 411 } # if subdirs
 412
 413 if (find_version(@page)) {
 414 return (1);
418 } else { 415 } else {
419 if ($debug) { 416 return (0);
420 print $reply->status_line; 
421 } 
422 } 417 }
 418 } else {
 419 if ($debug) {
 420 print $reply->status_line;
 421 }
 422 }
423} 423}
424 424
425# read a file and return array 425# read a file and return array
426sub readfile { 426sub readfile {
427 427
428 open(FILE, $_[0]) || die "$_[0] not found"; 428 open(FILE, $_[0]) || die "$_[0] not found";
429 my @ret = <FILE>; 429 my @ret = <FILE>;
430 close(FILE); 430 close(FILE);
431 431
432 return (@ret); 432 return (@ret);
433} 433}
434 434
435# match $match against a whole file 435# match $match against a whole file
436sub file_rx_check { 436sub file_rx_check {
437 437
438 my $match = $_[1]; 438 my $match = $_[1];
439 my $flat = join('\n', readfile($_[0])); 439 my $flat = join('\n', readfile($_[0]));
440 440
441 if ($flat =~ /$match/) { 441 if ($flat =~ /$match/) {
442 return (1); 442 return (1);
443 } else { 443 } else {
444 return (0); 444 return (0);
445 } 445 }
446} 446}
447 447
448my @packages; 448my @packages;
449 449
450my %opts; 450my %opts;
451exit(2) if !getopts('c:', \%opts); 451exit(2) if !getopts('c:', \%opts);
452$conf = $opts{c} if defined($opts{c}); 452$conf = $opts{c} if defined($opts{c});
453if ($#ARGV > -1) { 453if ($#ARGV > -1) {
454 @packages = @ARGV;  454 @packages = @ARGV;
455} else { 455} else {
456 @packages = readfile($conf); 456 @packages = readfile($conf);
457} 457}
458 458
459# load MASTER_SORT suffixes 459# load MASTER_SORT suffixes
460my $master_sort_flat = `cd $pkgsrcbase/pkgtools/pkg_chk && $make show-var VARNAME=MASTER_SORT`; 460my $master_sort_flat = `cd $pkgsrcbase/pkgtools/pkg_chk && $make show-var VARNAME=MASTER_SORT`;
461chomp($master_sort_flat); 461chomp($master_sort_flat);
462my @master_sort_list = reverse(split(/[\ \t]+/, $master_sort_flat)); 462my @master_sort_list = reverse(split(/[\ \t]+/, $master_sort_flat));
463my @master_list; 463my @master_list;
464 464
465sub sort_master_sites { 465sub sort_master_sites {
466 my $m_list = $_[0]; 466 my $m_list = $_[0];
467 my @s_list = (); 467 my @s_list = ();
468 468
469 @master_list = (); 469 @master_list = ();
470 470
471 if ($m_list =~ /$SF_NET/) { 471 if ($m_list =~ /$SF_NET/) {
472 # we only want ftp sites from SF 472 # we only want ftp sites from SF
473 $m_list =~ s/https?:\/\/[^\t\ \n]+//g; 473 $m_list =~ s/https?:\/\/[^\t\ \n]+//g;
474 $m_list =~ s/[\t\ \r\n]+//g; 474 $m_list =~ s/[\t\ \r\n]+//g;
475 } 475 }
476 476
477 # graphics/libggi packages-like fix (ftp://blahhttp://bleh): missing space 477 # graphics/libggi packages-like fix (ftp://blahhttp://bleh): missing space
478 # this is because of previous SF's char stripping 478 # this is because of previous SF's char stripping
479 $m_list =~ s/([^\ ])(ftp\:|http\:|https\:)/$1\ $2/g; 479 $m_list =~ s/([^\ ])(ftp\:|http\:|https\:)/$1\ $2/g;
480 480
481 foreach (@master_sort_list) { 481 foreach (@master_sort_list) {
482 if ($m_list =~ /(.*)(http|https|ftp)(\:\/\/[^\t\ ]*$_[^\t\ ]*)(.*)/) { 482 if ($m_list =~ /(.*)(http|https|ftp)(\:\/\/[^\t\ ]*$_[^\t\ ]*)(.*)/) {
483 push @s_list, $2.$3; 483 push @s_list, $2.$3;
484 $m_list = $1 . $4; 484 $m_list = $1 . $4;
485 } 485 }
486 } 486 }
487 @s_list = reverse @s_list; 487 @s_list = reverse @s_list;
488 push @master_list, @s_list; 488 push @master_list, @s_list;
489 push @master_list, split(/[\ \t]+/, $m_list); 489 push @master_list, split(/[\ \t]+/, $m_list);
490 490
491 @master_list = reverse @master_list; 491 @master_list = reverse @master_list;
492} 492}
493 493
494# used to record last connection 494# used to record last connection
495my $last_master_host = ""; 495my $last_master_host = "";
496 496
497foreach (@packages) { 497foreach (@packages) {
498 chomp; 498 chomp;
499 499
500 # ignore comments and newlines 500 # ignore comments and newlines
501 if (/^[#\n]/) { 501 if (/^[#\n]/) {
502 next; 502 next;
503 } 503 }
504 504
505 my $pkg = $_; 505 my $pkg = $_;
506 my $master_site; 506 my $master_site;
507 507
508 $pkgpath = "$pkgsrcbase/$pkg/"; 508 $pkgpath = "$pkgsrcbase/$pkg/";
509 509
510 $pkgname = `cd $pkgpath && $make show-var VARNAME=PKGNAME`; 510 $pkgname = `cd $pkgpath && $make show-var VARNAME=PKGNAME`;
511 chomp($pkgname); 511 chomp($pkgname);
512 512
513 $pkgversion = $pkgname; 513 $pkgversion = $pkgname;
514 $pkgversion =~ s/(.+)\-([0-9a-z_\.]+)$/$2/; 514 $pkgversion =~ s/(.+)\-([0-9a-z_\.]+)$/$2/;
515 $pkgname = $1; 515 $pkgname = $1;
516 $pkgversion =~ s/nb[0-9]+$//; 516 $pkgversion =~ s/nb[0-9]+$//;
517 517
518 my ($major, $minor) = split(/\./, $pkgversion); 518 my ($major, $minor) = split(/\./, $pkgversion);
519 519
520 chomp($distname = `cd $pkgpath && $make show-var VARNAME=DISTNAME`); 520 chomp($distname = `cd $pkgpath && $make show-var VARNAME=DISTNAME`);
521 521
522 # will we strip version numbers from extensions ? 522 # will we strip version numbers from extensions ?
523 my $nostrip = 0; 523 my $nostrip = 0;
524 524
525 $nicearc = 0; 525 $nicearc = 0;
526 # nice archive, has a comprehensive versioning 526 # nice archive, has a comprehensive versioning
527 if (defined($minor) && ($distname =~ /(.+?)($major[\._]?$minor.*$)/)) { 527 if (defined($minor) && ($distname =~ /(.+?)($major[\._]?$minor.*$)/)) {
528 $dist = $1; 528 $dist = $1;
529 $version = $2; 529 $version = $2;
530 $nicearc = 1; 530 $nicearc = 1;
531 # archive appears to only have a major 531 # archive appears to only have a major
532 } elsif (defined($major) && ($distname =~ /(.+)($major.*)/)) { 532 } elsif (defined($major) && ($distname =~ /(.+)($major.*)/)) {
533 $dist = $1; 533 $dist = $1;
534 $version = $2; 534 $version = $2;
535 # ok, archive versioning is a pure mess 535 # ok, archive versioning is a pure mess
536 # assume version is everything not being PKGNAME 536 # assume version is everything not being PKGNAME
 537 } else {
 538 $dist = $pkgname;
 539 $version = $distname;
 540 $version =~ s/$pkgname//;
 541
 542 # don't strip extensions
 543 $nostrip = 1;
 544 }
 545
 546 # MASTER_SITES is MASTER_SITE_LOCAL, skip
 547 if (file_rx_check("$pkgpath/Makefile",
 548 "MASTER_SITES.+MASTER_SITE_LOCAL")) {
 549 next;
 550 }
 551
 552 # extract HOMEPAGE
 553 my $homepage = `cd $pkgpath && $make show-var VARNAME=HOMEPAGE`;
 554 chomp($homepage);
 555
 556 # extract 1st MASTER_SITE from list
 557 my $master_flat_list = `cd $pkgpath && $make show-var VARNAME=MASTER_SITES`;
 558 chomp($master_flat_list);
 559
 560 sort_master_sites($master_flat_list);
 561
 562 next_master_site:
 563
 564 $master_site = pop @master_list;
 565 if (!$master_site) {
 566 next;
 567 }
 568 chomp($master_site);
 569
 570 # sourceforge archive
 571 if ($master_site =~ /$SF_NET.+\/(.+)\/?$/) {
 572 # SF ftp is hashed
 573 my $sfpkgdir = $1;
 574 my $hash = substr($sfpkgdir, 0, 1)."/".substr($sfpkgdir, 0, 2);
 575 $master_site =~ s/(.+sourceforge)\/.*/$1/;
 576 $master_site = $master_site."/".$hash."/$sfpkgdir";
 577 }
 578
 579 if (($distname eq "") || ($master_site eq "")) {
 580 print "missing DISTNAME or MASTER_SITES for package $pkgname\n";
 581 next;
 582 }
 583
 584 $version = dot_strip($version);
 585
 586 my $vers_display = $version;
 587 if ($vers_display eq "") {
 588 $vers_display = "none";
 589 }
 590
 591 $version = beta_strip($version);
 592
 593 # strip extensions
 594 if ($nostrip == 0) {
 595 $version = ext_strip($version);
 596 }
 597
 598 print "- checking for newer version of $pkg\n";
 599 print " \\ actual distname version: $vers_display\n";
 600 print " \\ master site: $master_site\n";
 601
 602 $extract_sufx = `cd $pkgpath && $make show-var VARNAME=EXTRACT_SUFX`;
 603 chomp($extract_sufx);
 604
 605 # protect special chars
 606 $dist =~ s/([\+\-\[\]\{\}\.\*])/\\$1/g;
 607
 608 $go_subdirs = 0;
 609 $pathvers = "";
 610
 611 # try HOMEPAGE first
 612 my $found = 0;
 613 if ($homepage ne "") {
 614 print " \\ homepage: $homepage\n";
 615 $found = http_ls($homepage, $distname);
 616 }
 617
 618 # homepage had no infos, fallback to MASTER_SITES
 619 if ($found == 0) {
 620
 621 # check if version exists on MASTER_SITES so we strip it
 622 # typically ftp://ftp.gnome.org/pub/GNOME/sources/gnome-core/1.4
 623 if ($nicearc) {
 624 $pathvers = $version;
 625 $pathvers =~ s/([0-9]+[\-_\.][0-9]+)([\-_\.][0-9]+)*/$1/;
 626 # strip master_site to parent
 627 if ($master_site =~ /(.+)\/[^\/]*$pathvers.*/) {
 628 # save full path
 629 $pathvers = $master_site;
 630 # base directory
 631 $master_site = $1;
 632 $go_subdirs = 1;
 633 }
 634 }
 635
 636 # ftp master site
 637 if ($master_site =~ /^ftp\:\/\//) {
 638 $nb_recurs = 0;
 639 # do not close / reconnect if new ftp site == last ftp site
 640 if (($master_site !~ /$last_master_host/) && defined($ftp)) {
 641 $ftp->quit;
 642 undef($ftp);
 643 }
 644
 645 ftp_ls($master_site, $distname);
 646 $last_master_host = $master_site;
 647 $last_master_host =~ s/(ftp:\/\/[^\/]+).*/$1/;
 648
 649 if (!defined($ftp)) {
 650 print " /!\\ there was an error while connecting to $master_site\n";
 651 # believe me you prefer see this than a while / break
 652 goto next_master_site;
 653 }
 654
 655 # http master site
 656 } elsif ($master_site =~ /^https?\:\/\//) {
 657 http_ls($master_site, $distname);
537 } else { 658 } else {
538 $dist = $pkgname; 659 print "unsupported MASTER_SITES protocol";
539 $version = $distname; 
540 $version =~ s/$pkgname//; 
541 
542 # don't strip extensions 
543 $nostrip = 1; 
544 } 
545 
546 # MASTER_SITES is MASTER_SITE_LOCAL, skip 
547 if (file_rx_check("$pkgpath/Makefile", 
548 "MASTER_SITES.+MASTER_SITE_LOCAL")) { 
549 next; 
550 } 
551 
552 # extract HOMEPAGE 
553 my $homepage = `cd $pkgpath && $make show-var VARNAME=HOMEPAGE`; 
554 chomp($homepage); 
555 
556 # extract 1st MASTER_SITE from list 
557 my $master_flat_list = `cd $pkgpath && $make show-var VARNAME=MASTER_SITES`; 
558 chomp($master_flat_list); 
559 
560 sort_master_sites($master_flat_list); 
561 
562 next_master_site: 
563 
564 $master_site = pop @master_list; 
565 if (!$master_site) { 
566 next; 
567 } 
568 chomp($master_site); 
569 
570 # sourceforge archive 
571 if ($master_site =~ /$SF_NET.+\/(.+)\/?$/) { 
572 # SF ftp is hashed 
573 my $sfpkgdir = $1; 
574 my $hash = substr($sfpkgdir, 0, 1)."/".substr($sfpkgdir, 0, 2); 
575 $master_site =~ s/(.+sourceforge)\/.*/$1/; 
576 $master_site = $master_site."/".$hash."/$sfpkgdir"; 
577 } 
578 
579 if (($distname eq "") || ($master_site eq "")) { 
580 print "missing DISTNAME or MASTER_SITES for package $pkgname\n"; 
581 next; 
582 } 
583 
584 $version = dot_strip($version); 
585 
586 my $vers_display = $version; 
587 if ($vers_display eq "") { 
588 $vers_display = "none"; 
589 } 
590 
591 $version = beta_strip($version); 
592 
593 # strip extensions 
594 if ($nostrip == 0) { 
595 $version = ext_strip($version); 
596 } 
597 
598 print "- checking for newer version of $pkg\n"; 
599 print " \\ actual distname version: $vers_display\n"; 
600 print " \\ master site: $master_site\n"; 
601 
602 $extract_sufx = `cd $pkgpath && $make show-var VARNAME=EXTRACT_SUFX`; 
603 chomp($extract_sufx); 
604 
605 # protect special chars 
606 $dist =~ s/([\+\-\[\]\{\}\.\*])/\\$1/g; 
607 
608 $go_subdirs = 0; 
609 $pathvers = ""; 
610 
611 # try HOMEPAGE first 
612 my $found = 0; 
613 if ($homepage ne "") { 
614 print " \\ homepage: $homepage\n"; 
615 $found = http_ls($homepage, $distname); 
616 } 
617 
618 # homepage had no infos, fallback to MASTER_SITES 
619 if ($found == 0) { 
620 
621 # check if version exists on MASTER_SITES so we strip it 
622 # typically ftp://ftp.gnome.org/pub/GNOME/sources/gnome-core/1.4 
623 if ($nicearc) { 
624 $pathvers = $version; 
625 $pathvers =~ s/([0-9]+[\-_\.][0-9]+)([\-_\.][0-9]+)*/$1/; 
626 # strip master_site to parent 
627 if ($master_site =~ /(.+)\/[^\/]*$pathvers.*/) { 
628 # save full path 
629 $pathvers = $master_site; 
630 # base directory 
631 $master_site = $1; 
632 $go_subdirs = 1; 
633 } 
634 } 
635 
636 # ftp master site 
637 if ($master_site =~ /^ftp\:\/\//) { 
638 $nb_recurs = 0; 
639 # do not close / reconnect if new ftp site == last ftp site 
640 if (($master_site !~ /$last_master_host/) && defined($ftp)) { 
641 $ftp->quit; 
642 undef($ftp); 
643 } 
644 
645 ftp_ls($master_site, $distname); 
646 $last_master_host = $master_site; 
647 $last_master_host =~ s/(ftp:\/\/[^\/]+).*/$1/; 
648 
649 if (!defined($ftp)) { 
650 print " /!\\ there was an error while connecting to $master_site\n"; 
651 # believe me you prefer see this than a while / break 
652 goto next_master_site; 
653 } 
654 
655 # http master site 
656 } elsif ($master_site =~ /^https?\:\/\//) { 
657 http_ls($master_site, $distname); 
658 } else { 
659 print "unsupported MASTER_SITES protocol"; 
660 } 
661 } 660 }
 661 }
662 662
663} # foreach package 663} # foreach package
664 664
665# if there was a resient ftp connexion, close it 665# if there was a resient ftp connexion, close it
666if (defined($ftp)) { 666if (defined($ftp)) {
667 $ftp->quit; 667 $ftp->quit;
668} 668}