8c908f948b09826c6cb4452ee5b282aca41be85e
galt
  Tue Dec 8 21:52:59 2015 -0800
Multi-region (exonMostly). This work allows people to look at virtual chromosomes from a list of regions and then navigate and perform all of the usual functions on it.

diff --git src/hg/utils/cpAndLinkToResourceFiles.pl src/hg/utils/cpAndLinkToResourceFiles.pl
index 9ea1bf6..b8933af 100755
--- src/hg/utils/cpAndLinkToResourceFiles.pl
+++ src/hg/utils/cpAndLinkToResourceFiles.pl
@@ -1,200 +1,203 @@
 #!/usr/bin/env perl
 
 # Copy files to resource directory; make versioned soft-links and/or files as appropriate (and delete obsolete ones too).
 
 use strict;
 
 use Cwd;
 use Getopt::Long;
 
 sub usage
 {
     my ($msg) = @_;
     print STDERR <<END;
 $msg
 
 Usage:
 
 cpAndLinkToResourceFiles.pl [OPTION] -destDir=dir -versionFile=file files
 
 Copy any modified static files to a directory in the apache DocumentRoot and create appropriately versioned softlinks.
 
 Options:
 
      -destDir=dir          Directory where we copy files
      -exclude=fileList     Comma-delimited list of files to exclude (useful if the files argument was created using "ls *.js")
      -force                Force update of all files
      -forceVersionNumbers  Force use of CGI versioned softlinks; useful for debugging in dev trees
      -minify               Minify javascript files (currently experimental)
      -versionFile=file     Get CGI version from this header file
 END
 }
 
 my ($exclude, $destDir, $debug, $versionFile, $cgiVersion, $useMtimes);
 my %exclude;
 my %seen;
 my $forceVersionNumbers;   # You can use this option to test CGI-versioned links on dev server
 my ($force, $minify);
 
 # minify code is experimental (hence this hardwired path; I'm not sure where to install the jar (in utils dir?)).
 my $minifyJar = "/cluster/home/larrym/tmp/yuicompressor-2.4.6/build/yuicompressor-2.4.6.jar";
 
 GetOptions("exclude=s" => \$exclude, "destDir=s" => \$destDir, "debug" => \$debug, "force" => \$force, "minify" => \$minify,
            "versionFile=s" => \$versionFile,  "forceVersionNumbers" =>  \$forceVersionNumbers);
 
 if($exclude) {
     %exclude = map { $_ => 1} split(/\s*,\s*/, $exclude);
 }
 
-usage("Missing/invalid destDir '$destDir'") if(!$destDir || !(-d $destDir));
+if(!$destDir || !(-d $destDir)) {
+    usage "Missing/invalid destDir";
+    die;
+}
 
 my $host = $ENV{HOST};
 if(!defined($host)) {
     $host = `/bin/hostname`;
     chomp($host);
 }
 
 # Use version based copies in production sites, mtime based links in dev sites (see redmine #3170 and 5104).
 if($forceVersionNumbers) {
     $useMtimes = 0;
 } else {
     $useMtimes = $host eq 'hgwdev' || $host eq 'genome-test' || $host eq 'genome-preview';
 }
 
 if(!$useMtimes) {
     if(defined($versionFile)) {
         open(FILE, $versionFile) || die "Couldn't open '$versionFile'; err: $!";
         while(<FILE>) {
             if(/CGI_VERSION \"([^\"]+)\"/) {
                 $cgiVersion = $1;
             }
         }
         close(FILE);
         if(!defined($cgiVersion)) {
             die "Couldn't find CGI_VERSION in '$versionFile'";
         }
     } else {
         die "Missing required versionFile parameter";
     }
 }
 
 $destDir =~ s/\/$//;
 
 my @destFiles;
 opendir(DIR, $destDir);
 for my $file (readdir(DIR)) {
     if($file !~ /^\./) {
         push(@destFiles, $file);
     }
 }
 closedir(DIR);
 
 # To avoid screwing up mirrors who run "rsync --links", we chdir into the resource directory and make non-absolute softlinks there.
 my $cwd = getcwd();
 chdir($destDir) || die "Couldn't chdir into '$destDir'; err: $!";
 
 for my $file (@ARGV)
 {
     if(!$seen{$file} && !$exclude{$file}) {
         $seen{$file} = 1;
         my $srcFile = "$cwd/$file";
         my @stat = stat($srcFile) or die "Couldn't stat '$srcFile'; err: $!";
         my $mtime = $stat[9];
         my ($prefix, $suffix);
         if($file =~ /(.+)\.([a-z]+)$/) {
             $prefix = $1;
             $suffix = $2;
         } else {
             die "Couldn't parse prefix and suffix out of file '$file'";
         }
 
         if($useMtimes) {
             # On dev machine, we copy file to apache dir and then create a mtime versioned softlink to this file.
 
             my $update = 0;
             my $exists = 0;
             my $destFile = $file;
             if(-e $destFile) {
                 my @destStat = stat("$destFile") or die "Couldn't stat '$destFile'; err: $!";
                 $update = ($destStat[9] < $mtime);
                 $exists = 1;
             } else {
                 $update = 1;
             }
             $update = $update || $force;
             if($update) {
                 if ($exists) {
                     unlink($destFile) || die "Couldn't unlink $destFile'; err: $!";
                 }
                 if($debug) {
                     print STDERR "cp -p $srcFile $destFile\n";
                 }
                 !system("cp -p $srcFile $destFile") || die "Couldn't cp $srcFile to $destFile: err: $!";
             }
 
             # make sure time is right, in case file; file might have been newer,
             # speculation that cp -p silently failed if user doesn't own destDir
             @stat = stat($destFile) or die "Couldn't stat '$destFile'; err: $!";
             $mtime = $stat[9];
 
             my $softLink = $file;
             $softLink =~ s/\.$suffix$/-$mtime.$suffix/;
 
             # Delete obsolete symlinks
             for my $f (@destFiles) {
                 if($f =~ /^$prefix-\d+\.$suffix$/ || $f =~ /^$prefix-v\d+\.$suffix$/) {
                     if($f ne $softLink) {
                         print STDERR "Deleting old soft-link $f\n" if($debug);
                         unlink($f) || die "Couldn't unlink obsolete softlink '$f'; err: $!";
                     }
                 }
             }
             # create new symlink
             if(!(-l "$softLink")) {
                 my $cmd = "ln -s $file $softLink";
                 print STDERR "cmd: $cmd\n" if($debug);
                 !system($cmd) || die "Couldn't $cmd; err: $!";
             }
         } else {
             # On production machines, we make a copy of git file with the CGI version burned in (see redmine #5104).
             # We also copy over a non-versioned copy for use by static files.
             my $versionedFile = $file;
             $versionedFile =~ s/\.$suffix$/-v$cgiVersion.$suffix/;
             for my $destFile ($file, $versionedFile) {
                 my $update = 0;
                 my $exists = 0;
                 if(-e $destFile) {
                     my @destStat = stat("$destFile") or die "Couldn't stat '$destFile'; err: $!";
                     $update = ($destStat[9] < $mtime);
                     $exists = 1;
                 } else {
                     $update = 1;
                 }
                 $update = $update || $force;
                 if($update) {
                     # delete obsolete files
                     for my $f (@destFiles) {
                         if(-e $f && $f =~ /^$prefix-v\d+\.$suffix$/) {
                             if($f ne $destFile) {
                                 print STDERR "Deleting old version of file $file: '$f'\n" if($debug);
                                 unlink($f) || die "Couldn't unlink obsolete versioned file '$f'; err: $!";
                             }
                         }
                     }
                     if($exists) {
                         unlink($destFile) || die "Couldn't unlink '$destFile'";
                     }
                     if($minify && $suffix eq 'js') {
                         my $cmd = "/usr/bin/java -jar $minifyJar $srcFile -o $destFile";
                         print STDERR "cmd: $cmd\n" if($debug);
                         !system($cmd) || die "Couldn't run cmd '$cmd': err: $!";
                     } else {
                         my $cmd = "cp -p $srcFile $destFile";
                         print STDERR "cmd: $cmd\n" if($debug);
                         !system($cmd) || die "Couldn't $cmd; err: $!";
                     }
                 }
             }
         }
     }
 }