9c5b57f6dcb552c8a8be9dd920790a4ba1aee3c0
larrym
  Mon Mar 14 12:29:58 2011 -0700
coallesce cpAndLinkToResourceFiles.pl
diff --git src/hg/utils/cpAndLinkToResourceFiles.pl src/hg/utils/cpAndLinkToResourceFiles.pl
new file mode 100755
index 0000000..8ad153b
--- /dev/null
+++ src/hg/utils/cpAndLinkToResourceFiles.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/env perl
+
+# Copy files to resource directory; make versioned soft-links 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 [-exclude=...] -destDir=... files
+END
+}
+
+my ($exclude, $destDir, $debug);
+my %exclude;
+
+GetOptions("exclude=s" => \$exclude, "destDir=s" => \$destDir, "debug" => \$debug);
+
+if($exclude) {
+    %exclude = map { $_ => 1} split(/\s*,\s*/, $exclude);
+}
+
+usage("Missing/invalid destDir '$destDir'") if(!$destDir || !(-d $destDir));
+
+$destDir =~ s/\/$//;
+
+my @destFiles;
+for (`ls $destDir`) {
+    chomp;
+    push(@destFiles, $_);
+}
+
+# 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(!$exclude{$file}) {
+        my @stat = stat("$cwd/$file") or die "Couldn't stat '$file'; err: $!";
+        my $mtime = $stat[9];
+        
+        # update destination file as appropriate
+        my $update = 0;
+        my $destFile = $file;
+        if(-e $destFile) {
+            my @destStat = stat("$destFile") or die "Couldn't stat '$destFile'; err: $!";
+            $update = ($destStat[9] < $mtime);
+        } else {
+            $update = 1;
+        }
+        if($update) {
+            if (-e $destFile) {
+                unlink($destFile) || die "Couldn't unlink $destFile'; err: $!";
+            }
+            !system("cp -p $cwd/$file $destFile") || die "Couldn't cp $cwd/file to $destFile: err: $!";
+        }
+
+        if($file =~ /(.+)\.[a-z]+$/) {
+            my $prefix = $1;
+            # 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/\..js/-$mtime.js/;
+            $softLink =~ s/\.([a-z]+)$/-$mtime.$1/;
+            #$softLink =~ s/\..([css|js])/-$mtime.$1/;
+            # Delete obsolete symlinks
+            for my $f (@destFiles) {
+                if($f =~ /^$prefix-(\d+)\..*$/) {
+                    if($f ne $softLink) {
+                        print STDERR "Deleting old soft-link $f\n" if($debug);
+                        unlink($f) || die "Couldn't unlink obsolete softlink '$softLink'; err: $!";
+                    }
+                }
+            }
+            # create new symlink
+            if(!(-l "$softLink")) {
+                print STDERR "ln -s $softLink\n" if($debug);
+                !system("ln -s $file $softLink") || die "Couldn't ln -s $file; err: $!";
+            }
+        }
+    }
+}