0adc263d0e001f8a24d2e329d45f0029ff132b30 larrym Mon Mar 14 14:25:59 2011 -0700 Use version based links in production sites, mtime based links in dev sites (see redmine #3170) diff --git src/hg/utils/cpAndLinkToResourceFiles.pl src/hg/utils/cpAndLinkToResourceFiles.pl index 8ad153b..3bf6c95 100755 --- src/hg/utils/cpAndLinkToResourceFiles.pl +++ src/hg/utils/cpAndLinkToResourceFiles.pl @@ -7,88 +7,129 @@ 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, $destDir, $debug, $versionFile, $cgiVersion, $useMtimes); my %exclude; +my $forceVersionNumbers; # You can use this option to test CGI-versioned links on dev server -GetOptions("exclude=s" => \$exclude, "destDir=s" => \$destDir, "debug" => \$debug); +GetOptions("exclude=s" => \$exclude, "destDir=s" => \$destDir, "debug" => \$debug, + "versionFile=s" => \$versionFile, "forceVersionNumbers" => \$forceVersionNumbers); if($exclude) { %exclude = map { $_ => 1} split(/\s*,\s*/, $exclude); } usage("Missing/invalid destDir '$destDir'") if(!$destDir || !(-d $destDir)); +my $host = $ENV{HOST}; +if(!defined($host)) { + $host = `/bin/hostname`; + chomp($host); +} + +# Use version based links in production sites, mtime based links in dev sites (see redmine #3170) +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; -for (`ls $destDir`) { - chomp; - push(@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(!$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: $!"; } + if($debug) { + print STDERR "cp -p $cwd/$file $destFile\n"; + } !system("cp -p $cwd/$file $destFile") || die "Couldn't cp $cwd/file to $destFile: err: $!"; } - if($file =~ /(.+)\.[a-z]+$/) { + if($file =~ /(.+)\.([a-z]+)$/) { my $prefix = $1; + my $suffix = $2; # 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/; + if($useMtimes) { + $softLink =~ s/\.${suffix}$/-$mtime.${suffix}/; + } else { + $softLink =~ s/\.${suffix}$/-v$cgiVersion.${suffix}/; + } # Delete obsolete symlinks for my $f (@destFiles) { - if($f =~ /^$prefix-(\d+)\..*$/) { + if(($useMtimes && $f =~ /^$prefix-\d+\.$suffix$/) || ($useMtimes && $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 '$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: $!"; } } } }