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