source: branches/profile/util/arb_srclst.pl

Last change on this file was 12767, checked in by westram, 5 years ago
  • pack .svg + .png into source-tarball
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 22.0 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6my $debug_matching = 0; # set to 1 to view file matching and decision
7my $ignore_unknown = 0;
8
9# ------------------------------------------------------------
10# override checks below and save strictly as checked-in in SVN
11
12my @strictly_as_in_svn_when_matchesDir = (
13                                           qr/\/GDE\/MAFFT\/mafft-[0-9\.]+-with[out]*-extensions/o,
14                                          );
15
16# ------------------------------------------------------------
17# skipped_directories and files inside are never examined:
18
19my @skipped_directories = (
20                           qr/\/.+\/bin$/o,
21                           qr/\/.+\/build$/o,
22                           qr/\/HELP_SOURCE\/Xml$/o,
23                           qr/\/GDE\/MUSCLE\/obj$/o,
24                           qr/\/GDE\/PHYML20130708\/phyml\/autom4te.cache$/o,
25                           qr/\/GDE\/RAxML8\/builddir/o,
26                           qr/\/ignore\./o,
27                           qr/\/PERL2ARB\/blib$/o,
28                           qr/\/HEADERLIBS\/[^\/]+/o,
29                           qr/\/UNIT_TESTER\/logs$/o,
30                           qr/\/UNIT_TESTER\/tests$/o,
31                           qr/\/UNIT_TESTER\/tests\.slow$/o,
32                           qr/\/UNIT_TESTER\/run\/homefake\/.arb_prop\/(macros|cfgSave)$/o,
33                           qr/^\.\/ARB_SOURCE_DOC/o,
34                           qr/^\.\/dep_graphs/o,
35                           qr/^\.\/INCLUDE$/o,
36                           qr/^\.\/lib\/help$/o,
37                           qr/^\.\/lib\/help_html$/o,
38                           qr/^\.\/lib\/pts$/o,
39                           qr/^\.\/lib\/mafft$/o,
40                           qr/^\.\/patches.arb$/o,
41                           qr/^\.\/PERL5$/o,
42                           qr/_COM\/DUMP$/o,
43                           qr/_COM\/GEN[CH]$/o,
44                           qr/_COM\/O$/o,
45                           qr/_GEN$/o,
46                           qr/nbproject/o,
47                           # needed by ralf:
48                           qr/^\.\/test_arb_make_targets_logs/o,
49                           qr/\.dSYM$/o,
50                          );
51
52# first used/skipped match wins (exception see @3 below)
53
54my %used_files = map { $_ => 1; } (
55                                   '!BRANCH_STATE',
56                                   'AUTHORS',
57                                   'COPYING',
58                                   'demo.arb',
59                                   'Doxyfile',
60                                   'export2sub',
61                                   'Makefile',
62                                   'Makefile.org',
63                                   'Makefile.setup.include',
64                                   'Makefile.setup.template',
65                                   'Makefile.suite',
66                                   'Makefile.test',
67                                   'needs_libs',
68                                  );
69
70my %skipped_files = map { $_ => 1; } (
71                                      '.build.lst',
72                                      '.cvsignore',
73                                      '.depends',
74                                      'ChangeLog',
75                                      'config.makefile',
76                                      'helpfiles.lst',
77                                      'last.success',
78                                      'Makefile.setup.local',
79                                      'makeloc.here',
80                                      'makeloc.here',
81                                      'nt_date.h',
82                                      'postcompile.sav',
83                                      'TAGS',
84                                      '.DS_Store',
85                                      );
86
87my %used_extensions = map { $_ => 1; } ( # matches part behind last '.' in filename
88                                        'c', 'cpp', 'cxx', 'cc',
89                                        'h', 'hpp', 'hxx',
90
91                                        'aisc', 'pa',
92                                        'bitmap',
93                                        'dtd', 'xsl',
94                                        'f',
95                                        'footer',
96                                        'head', 'header',
97                                        'i',  # swig input
98                                        'inc',
99                                        'java', 'manifest',
100                                        'makefile',
101                                        'pl', 'pm', 'PL', 'cgi', 'xs',
102                                        'awk',
103                                        'py',
104                                        'script',
105                                        'sh',
106                                        'source', 'menu',
107                                        'template', 'default',
108                                        'txt', 'doc', 'ps', 'pdf',
109                                        'tgz', 'gz',
110                                        'svg', 'png',
111                                       );
112
113my %skipped_extensions = map { $_ => 1; } ( # matches part behind last '.' in filename
114                                           'a',
115                                           'bak',
116                                           'class',
117                                           'bundle', # Some file from XCode
118                                           'gcno',
119                                           'genmenu',
120                                           'jar',
121                                           'last_gcc',
122                                           'last_compiler',
123                                           'list',
124                                           'log',
125                                           'o',
126                                           'old',
127                                           'patch',
128                                           'rej',
129                                           'so',
130                                           'stamp',
131                                           'swp',
132                                           'yml', 'json', # perl2arb
133                                          );
134
135
136# used_when_matches, skipped_when_matches and used_when_matchesFull are only tested,
137# if above filters did not match:
138
139my @used_when_matches = (
140                         qr/^arb_.*\.txt$/o,
141                         qr/disclaimer/io,
142                         qr/license/io,
143                         qr/needs_libs\..*/io,
144                         qr/readme$/io,
145                         qr/typemap$/io,
146                        );
147
148my @skipped_when_matches = (
149                            qr/.*~$/o, # backups
150                            qr/\#.*\#$/o,
151                            qr/\.\#.*$/o,
152                            qr/^arbsrc.*\.tgz$/o,
153                            qr/^arbsrc\.lst$/o,
154                            qr/^arbsrc\.lst\.tmp$/o,
155                            qr/^callgrind\./o,
156                           );
157
158my @used_when_matchesFull = (
159                             qr/\/AISC_COM\/AISC\/magic.lst$/o,
160                             qr/\/CLUSTALW\/.*$/o,
161                             qr/\/EISPACK\/rg\.html$/o,
162                             qr/\/GDE\/.*\.html$/o,
163                             qr/\/GDEHELP\/FASTA/o,
164                             qr/\/GDEHELP\/GDE.*/o,
165                             qr/\/GDEHELP\/HELP_PLAIN/o,
166                             qr/\/GDEHELP\/HELP_WRITTEN/o,
167                             qr/\/GDEHELP\/Makefile\.helpfiles/o,
168                             qr/\/HEADERLIBS\/.*COPYING$/o,
169                             qr/\/HELP_SOURCE\/.*\.gif$/o,
170                             qr/\/HELP_SOURCE\/oldhelp\/.*\.(ps|pdf)\.gz$/o,
171                             qr/\/HELP_SOURCE\/oldhelp\/.*\.hlp$/o,
172                             qr/\/HGL_SRC\/plot\.icon$/o,
173                             qr/\/PERL2ARB\/.*\.html$/o,
174                             qr/\/PERL2ARB\/Makefile.main$/o,
175                             qr/\/PHYLIP\/doc\//o,
176                             qr/\/PROBE_SERVER\/.*\.conf$/o,
177                             qr/\/READSEQ\/.*\.help$/o,
178                             qr/\/READSEQ\/Formats$/o,
179                             qr/\/SH\/[^\/\.]*$/o,
180                             qr/\/SOURCE_TOOLS\//o,
181                             qr/\/TREEPUZZLE\/.*\.gif$/o,
182                             qr/\/UNIT_TESTER\/run\/.*\.a00$/o,
183                             qr/\/UNIT_TESTER\/run\/.*\.arb$/o,
184                             qr/\/UNIT_TESTER\/run\/.*\.amc$/o,
185                             qr/\/UNIT_TESTER\/run\/.*\.expected$/o,
186                             qr/\/UNIT_TESTER\/run\/.*\.fig$/o,
187                             qr/\/UNIT_TESTER\/run\/.*\.in$/o,
188                             qr/\/UNIT_TESTER\/run\/.*\.inp$/o,
189                             qr/\/UNIT_TESTER\/run\/.*\.input$/o,
190                             qr/\/UNIT_TESTER\/run\/.*\.out$/o,
191                             qr/\/UNIT_TESTER\/run\/.*\.tree$/o,
192                             qr/\/UNIT_TESTER\/run\/help\//o,
193                             qr/\/UNIT_TESTER\/run\/impexp\/.*\.exported$/o,
194                             qr/\/UNIT_TESTER\/valgrind\/arb_valgrind_logged$/o,
195                             qr/^\.\/etc\//o,
196                             qr/^\.\/lib\/arb_default\/.*\.arb$/o,
197                             qr/^\.\/lib\/arb_tcp_org\.dat$/o,
198                             qr/^\.\/lib\/config\.[^\.]+$/io,
199                             qr/^\.\/lib\/desktop\/.*$/o,
200                             qr/^\.\/lib\/export\/.*\.eft$/o,
201                             qr/^\.\/lib\/import\/.*\.ift2?$/o,
202                             qr/^\.\/lib\/inputMasks\/.*\.mask$/o,
203                             qr/^\.\/lib\/macros\/.*\.amc$/o,
204                             qr/^\.\/lib\/macros\/.checks\/.*\.expected$/o,
205                             qr/^\.\/lib\/nas\/names\.dat\.template$/o,
206                             qr/^\.\/lib\/pictures\/.*\.(fig|vfont)$/o,
207                             qr/^\.\/lib\/pixmaps\/.*\.xpm$/o,
208                             qr/^\.\/lib\/protein_2nd_structure\/.*\.dat$/o,
209                             qr/^\.\/lib\/rna3d\/.*\.(pdb|data)$/o,
210                             qr/^\.\/lib\/rna3d\/images\/.*\.png$/o,
211                             qr/^\.\/lib\/sellists\/.*\.sellst$/o,
212                             qr/^\.\/lib\/submit\//o,
213                             qr/^\.\/lib\/BUGS\//o,
214                             qr/^\.\/util\/arb_.*$/o,
215                             qr/^\.\/util\/config\..*$/o,
216                             qr/\/GDE\/.*\/Makefile\.[^\/]+$/io,
217                             qr/\/GDE\/PHYML[^\/]+\/phyml\//o,
218                            );
219
220# skipped_when_matchesFull and forced_when_matchesFull are always tested! (@3)
221
222my @skipped_when_matchesFull = (
223                                qr/\/genhelp\/.*\.hlp$/o,
224                                qr/\/lib\/addlibs\/(lib.*\.so\..*)$/o,
225                                qr/^\.\/arb.*\.tgz$/o,
226                                qr/^\.\/bin\//o,
227                                qr/^\.\/GDE\/CORE\/functions.h$/o,
228                                qr/^\.\/GDE\/PHYML[^\/]+\/phyml\/(configure|config.h.in)$/o,
229                                qr/^\.\/lib\/ARB\.pm$/o,
230                                qr/^\.\/lib\/arb_tcp\.dat$/o,
231                                qr/^\.\/lib\/gde\/.*\.menu$/o,
232                                qr/^\.\/lib\/nas\/names.*\.dat$/o,
233                                qr/^\.\/lib\/macros\/\.checks\/.*\.ids$/o,
234                                qr/^\.\/lib\/motifHack\/pixmaps\/.*$/o,
235                                qr/^\.\/PERL2ARB\/.*\.h$/o,
236                                qr/^\.\/PERL2ARB\/ARB\.bs$/o,
237                                qr/^\.\/PERL2ARB\/ARB\.c$/o,
238                                qr/^\.\/PERL2ARB\/ARB\.xs$/o,
239                                qr/^\.\/PERL2ARB\/Makefile$/o,
240                                qr/^\.\/PERL2ARB\/Makefile.PL$/o,
241                                qr/^\.\/PERL2ARB\/perlmain.c$/o,
242                                qr/^\.\/PERL2ARB\/pm_to_blib$/o,
243                                qr/^\.\/SOURCE_TOOLS\/valgrind2grep\.lst$/o,
244                                qr/^\.\/SOURCE_TOOLS\/stamp\./o,
245                                qr/^\.\/TEMPLATES\/arb_build\.h$/o,
246                                qr/^\.\/UNIT_TESTER\/run\/TEST_g?pt\.arb$/o,
247                                qr/^\.\/UNIT_TESTER\/run\/.*\.ARM$/o,
248                                qr/^\.\/UNIT_TESTER\/run\/.*\.ARF$/o,
249                                qr/^\.\/UNIT_TESTER\/Makefile\.setup\.local\.last$/o,
250                                qr/^\.\/TAGS\./o, # avoid failure while 'make tags' is running
251                                qr/date\.xsl$/o,
252                               );
253
254my @forced_when_matchesFull = (
255                               qr/^\.\/bin\/Makefile/o,
256                               qr/\/PROBE_WEB\/SERVER\/.*\.jar$/o,
257                               qr/\/GDE\/PHYML[^\/]+\/phyml\/.*\.log$/o,
258                              );
259
260# files that are even packed when generated and not in VC
261my @pack_fullGenerated = (
262                          qr/\/TEMPLATES\/svn_revision\.h$/o,
263                         );
264
265# ------------------------------------------------------------
266# sanity checks
267
268foreach (keys %used_extensions) {
269  if (exists $skipped_extensions{$_}) { die "'$_' in \$used_extensions and \$skipped_extensions"; }
270}
271foreach (keys %used_files) {
272  if (exists $skipped_files{$_}) { die "'$_' in \$used_files and \$skipped_files"; }
273}
274
275# ------------------------------------------------------------
276
277sub useDir($) {
278  my ($dir) = @_;
279
280  if ($dir =~ /.svn$/o) { return 0; }
281  if ($dir =~ /CVS$/o) { return 0; }
282  foreach (@skipped_directories) {
283    if ($dir =~ $_) { return 0; }
284  }
285  return 1;
286}
287
288sub matchingExpr($\@) {
289  # return 0 if no regexp matched, return index+1 otherwise
290  my ($str,$regexp_arr_r) = @_;
291
292  my $regexps = scalar(@$regexp_arr_r);
293  for (my $r=0; $r<$regexps; $r++) {
294    my $reg = $$regexp_arr_r[$r];
295    if ($str =~ $reg) {
296      return $r+1;
297    }
298  }
299  return 0;
300}
301
302sub useIfMatching($\@\$) {
303  my ($str,$regexp_arr_r,$use_r) = @_;
304  my $matches = matchingExpr($str,@$regexp_arr_r);
305  if ($matches>0) {
306    if ($debug_matching!=0) { print STDERR "'$str' matches '".$$regexp_arr_r[$matches-1]."' => use!\n"; }
307    $$use_r = 1;
308  }
309}
310sub dontUseIfMatching($\@\$) {
311  my ($str,$regexp_arr_r,$use_r) = @_;
312  my $matches = matchingExpr($str,@$regexp_arr_r);
313  if ($matches>0) {
314    if ($debug_matching!=0) { print STDERR "'$str' matches '".$$regexp_arr_r[$matches-1]."' => don't use!\n"; }
315    $$use_r = 0;
316  }
317}
318
319sub useFile($$) {
320  my ($dir,$file) = @_;
321
322  my $use = undef;
323  if (exists $used_files{$file}) { $use = 1; }
324  elsif (exists $skipped_files{$file}) { $use = 0; }
325
326  my $hasExt = 0;
327  if (not defined $use) {
328    if ($file =~ /\.([^\.]+)$/o) {
329      my $ext = $1;
330      $hasExt = 1;
331      if (exists $used_extensions{$ext}) {
332        if ($debug_matching!=0) { print STDERR "'$file' matches extension '".$ext."' => use!\n"; }
333        $use = 1;
334      }
335      elsif (exists $skipped_extensions{$ext}) {
336        if ($debug_matching!=0) { print STDERR "'$file' matches extension '".$ext."' => don't use!\n"; }
337        $use = 0;
338      }
339    }
340  }
341
342  if (not defined $use) {
343    useIfMatching($file,@used_when_matches, $use);
344  }
345
346  if (not defined $use) {
347    dontUseIfMatching($file,@skipped_when_matches, $use);
348  }
349
350  my $full;
351  if (not defined $use) {
352    $full = $dir.'/'.$file;
353
354    useIfMatching($full,@used_when_matchesFull, $use);
355    if (not defined $use) {
356      if (-X $full and $hasExt==0) { $use = 0; } # exclude binaries by default (wrong for scripts)
357    }
358  }
359
360  if (not defined $use or $use==1) {
361    if (not defined $full) { $full = $dir.'/'.$file; }
362
363    dontUseIfMatching($full,@skipped_when_matchesFull, $use);
364  }
365  if (not defined $use or $use==0) {
366    if (not defined $full) { $full = $dir.'/'.$file; }
367    useIfMatching($full,@forced_when_matchesFull, $use);
368  }
369
370  if (not defined $use) {
371    if ($ignore_unknown==0) {
372      die "Don't know whether to use or skip '$file' (in $dir)";
373    }
374    $use = 1;
375  }
376
377  return $use;
378}
379
380# ------------------------------------------------------------
381
382my $VC_FILE    = 1;
383my $VC_DIR     = 2;
384my $VC_UNKNOWN = 3; # in SVN, but unknown whether dir or file
385
386my $svn_entries_read = 0;
387my %all_svn_entries = ();
388
389sub isSVNcheckout($) {
390  my ($dir) = @_;
391  if (-f $dir.'/.svn/entries') { return 1; }
392  if (-f $dir.'/.svn/wc.db') { return 1; }
393  return 0;
394}
395
396sub getSVNEntries($\%) {
397  my ($dir,$SVN_r) = @_;
398
399  if ($svn_entries_read==0) { # first call
400    if (isSVNcheckout($dir)==0) { return 0; }
401
402    my $cmd = "svn status -v $dir";
403    open(SVNSTATUS, "$cmd|") || die "failed to execute '$cmd' (Reason: $!)";
404
405    eval {
406      my $reg_status_line = qr/^(.*)\s+[0-9]+\s+[0-9]+\s+[^\s]+\s+([^\s]+)$/;
407
408      my $line;
409      while (defined($line=<SVNSTATUS>)) {
410        chomp($line);
411        if ($line =~ $reg_status_line) {
412          my ($flags,$name) = ($1,$2);
413          if (-f $name) {
414            $all_svn_entries{$name} = $VC_FILE;
415          }
416          elsif (-d $name) {
417            $all_svn_entries{$name} = $VC_DIR;
418          }
419          else {
420            $all_svn_entries{$name} = $VC_UNKNOWN;
421          }
422        }
423        else {
424          if ($line =~ /^?/) {
425            ; # silently ignore unknown files
426          }
427          else {
428            die "Cant parse line '$line'";
429          }
430        }
431      }
432    };
433    if ($@) {
434      die "Failed to read svn status: $@";
435    }
436
437    close(SVNSTATUS);
438    $svn_entries_read = 1;
439  }
440
441  if ($dir eq '.') {
442    foreach (keys %all_svn_entries) {
443      if (not /\//) { # root entry
444        $$SVN_r{$_} = $all_svn_entries{$_};
445      }
446    }
447  }
448  else {
449    if (not $dir =~ /^\.\//) { die "expected '$dir' to start with './'"; }
450    my $sdir = $';
451    my $reg_matchdir = qr/^$sdir\//;
452    foreach (keys %all_svn_entries) {
453      if ($_ =~ $reg_matchdir) {
454        my $rest = $';
455        if (not $rest =~ /\//) { # in $dir (not below)
456          $$SVN_r{$rest} = $all_svn_entries{$_};
457        }
458      }
459    }
460  }
461
462  return 1;
463}
464
465sub getCVSEntries($\%) {
466  my ($dir,$CVS_r) = @_;
467
468  my $cvsentries = $dir.'/CVS/Entries';
469  if (-f $cvsentries) {
470    open(CVS,'<'.$cvsentries) || die "can't read '$cvsentries' (Reason: $!)";
471    eval {
472      foreach (<CVS>) {
473        chomp;
474        if (/^D\/([^\/]+)\//o) { # directory
475          $$CVS_r{$1} = $VC_DIR;
476        }
477        elsif (/^\/([^\/]+)\//o) { # file
478          $$CVS_r{$1} = $VC_FILE;
479        }
480        elsif (/^D$/o) {
481          ;
482        }
483        else {
484          die "can't parse line '$_'";
485        }
486      }
487    };
488    if ($@) { die "$@ while reading $cvsentries"; }
489    close(CVS);
490    return 1;
491  }
492  return 0;
493}
494
495my $VC = '<no VC>';
496
497sub getVCEntries($\%) {
498  my ($dir,$VC_r) = @_;
499
500  my $res = 1;
501  if (getSVNEntries($dir,%$VC_r)==0) {
502    if (getCVSEntries($dir,%$VC_r)==0) {
503      $VC = '<no VC>';
504      $res = 0;
505    }
506    else {
507      $VC = 'CVS';
508    }
509  }
510  else {
511    $VC = 'SVN';
512  }
513
514  if (0) {
515    print "$VC entries for $dir:\n";
516    foreach (sort keys %$VC_r) {
517      print " ".$$VC_r{$_}.": $_\n";
518    }
519  }
520
521  return $res;
522}
523
524# ------------------------------------------------------------
525
526sub expectVCmember($$\%) {
527  my ($full,$item,$VC_r) = @_;
528  if ((not defined $$VC_r{$item}) and ($ignore_unknown==0)) {
529    if (not matchingExpr($full,@pack_fullGenerated)) {
530      die "'$full' ($_) included, but not in $VC (seems to be generated)";
531    }
532  }
533}
534
535my %unpackedCVSmember = map { $_ => 1; } (
536                                          '.cvsignore',
537                                          'ChangeLog',
538                                         );
539
540sub unexpectVCmember($$\%) {
541  my ($full,$item,$VC_r) = @_;
542  if (defined $$VC_r{$item}) {
543    if ((not exists $unpackedCVSmember{$item}) and ($ignore_unknown==0)) {
544      die "'$full' excluded, but in $VC";
545    }
546  }
547}
548
549sub is_version_controlled($\%) {
550  my ($item,$VC_r) = @_;
551  if (defined $$VC_r{$item}) {
552    return 1;
553  }
554  return 0;
555}
556
557sub saveAsInSVNforDir($) {
558  my ($dir) = @_;
559  foreach my $reg (@strictly_as_in_svn_when_matchesDir) {
560    if ($dir =~ $reg) {
561      return 1;
562    }
563  }
564  return 0;
565}
566
567sub dumpFiles($);
568sub dumpFiles($) {
569  my ($dir) = @_;
570
571  eval {
572    my @subdirs;
573    my @files;
574
575    my %CVS;
576    if (!getVCEntries($dir,%CVS)) {
577      die "arb_srclst.pl only works in a SVN checkout";
578    }
579
580    my $as_in_svn = saveAsInSVNforDir($dir);
581
582    opendir(DIR,$dir) || die "can't read directory '$dir' (Reason: $!)";
583    foreach (readdir(DIR)) {
584      if ($_ ne '.' and $_ ne '..') {
585        my $full = $dir.'/'.$_;
586
587        # print STDERR "full='$full' (as_in_svn=$as_in_svn)\n";
588
589        if (not -l $full) {
590          if (-d $full) {
591            if ($as_in_svn==1) {
592              if (is_version_controlled($_,%CVS)==1) {
593                push @subdirs, $full;
594              }
595            }
596            else {
597              if (useDir($full)==1) {
598                expectVCmember($full,$_,%CVS);
599                push @subdirs, $full;
600              }
601              else { unexpectVCmember($full,$_,%CVS); }
602            }
603          }
604          elsif (-f $full) {
605            if ($as_in_svn==1) {
606              if (is_version_controlled($_,%CVS)==1) {
607                push @files, $full;
608              }
609            }
610            else {
611              if (useFile($dir,$_)==1) {
612                expectVCmember($full,$_,%CVS);
613                push @files, $full;
614              }
615              else { unexpectVCmember($full,$_,%CVS); }
616            }
617          }
618          else { die "Unknown (neighter link nor file nor directory): '$full'"; }
619        }
620      }
621    }
622    closedir(DIR);
623
624    foreach (@files) { print $_."\n"; }
625    foreach (@subdirs) { dumpFiles($_); }
626  };
627  if ($@) {
628    my $err = $@;
629    if ($err =~ /at\s(.*\.pl)\sline\s([0-9]+)/) {
630      $err = "$1:$2: Error: $`";
631    }
632    $err =~ s/\n//g;
633    die "$err\n";
634  }
635}
636
637my $args = scalar(@ARGV);
638if ($args==0) {
639  dumpFiles('.');
640}
641else {
642  my $arg = $ARGV[0];
643  if ($arg eq 'ignore') {
644    $ignore_unknown = 1;
645    dumpFiles('.');
646  }
647  elsif ($arg eq 'matching') {
648    $debug_matching = 1;
649    dumpFiles('.');
650  }
651  else {
652    die "Usage: arb_srclst.pl [ignore|matching]\n";
653  }
654}
Note: See TracBrowser for help on using the repository browser.