1#!/usr/bin/perl -w 2# 3# Archive the PhysicalConstants.xml file in data/old_versions 4# Boyd Duffee, July 2017 5# 6# TODO 7# - use relative paths to run script from anywhere 8 9use strict; 10use autodie; 11use 5.010; 12use XML::LibXML; 13use Digest::MD5; 14use File::Copy; 15 16my $file = $ARGV[0] || 'data/PhysicalConstants.xml'; 17die "Can't file $file (run from the top directory)" unless -f $file; 18my $archive_dir = join '/', qw/data old_versions/; 19 20my $xml = XML::LibXML->load_xml(location => $file, no_blanks => 1); 21 22my $version = $xml->getElementsByTagName('version'); 23my $standard = $xml->getElementsByTagName('reference_standard'); 24my $year = (localtime)[5] + 1900; 25 26print "My version is $version for the $standard standard\n"; 27my $archive_name = join '_', 'constants', $year, $version; 28my $extension = '.xml'; 29 30my $save_file = join '/', $archive_dir, "$archive_name$extension"; 31if (-e $save_file) { 32 print "File $save_file exists. Renaming\n"; 33 my @versions = glob("$archive_dir/$archive_name*"); 34 my $last_version = pop @versions; 35 if ( check_same_files($file, $last_version) ) { 36 say "File already archived as $save_file Exiting"; 37 exit; 38 } 39 my $n = 2; 40 if ( $last_version =~ /$extension\.(\d+)$/ ) { 41 $save_file = join '.', $save_file, ($1 + 1); 42 } 43 else { 44 $save_file .= '.1'; 45 } 46} 47 48copy( $file, $save_file ); 49say "$file archived as $save_file"; 50 51exit; 52 53sub check_same_files { 54 my ($didi, $gogo) = @_; 55 return checksum($didi) eq checksum($gogo); 56} 57 58sub checksum { 59 my $filename = shift; 60 open (my $fh, '<', $filename) or die "Can't open '$filename': $!"; 61 binmode ($fh); 62 63 say "Checking $filename"; 64 return Digest::MD5->new->addfile($fh)->hexdigest; 65} 66