1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/perl 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse strict; 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse warnings; 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse version; 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Carp; 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Digest; 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse File::Spec; 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse File::Spec::Unix; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse YAML::Tiny; 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $version = qv('0.0.1'); 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub say { 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver print @_, "\n"; 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $basedir = '../..'; 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $commands = { 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'help' => \&help, 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'add' => \&add, 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'status' => \&status, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $help = {}; 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub filetype { 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($path) = @_; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($path =~ /\.(java|g)$/xms) { 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 'text/plain'; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 'application/octet-stream'; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub sha1sum { 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($filename) = @_; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver open my $in, '<', $filename or croak "Can't open $filename: $!"; 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (filetype($filename) =~ /^text\//xms) { 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # keep standard line feed conversion 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!binmode $in) { 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver croak "Can't binmode $filename: $!"; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $sha1 = Digest->new('SHA-1'); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $sha1->addfile($in); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $digest = $sha1->hexdigest; 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver close $in or warn "Can't close $filename: $!"; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $digest; 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $inc_paths = [ 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $basedir, 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "$basedir/runtime/Java/src", 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub resolve_file { 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($filename) = @_; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $resolved_file; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (-e $filename) { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $resolved_file = $filename; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my @canidates 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver = grep { -e $_ } 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver map { File::Spec->catfile($_, $filename) } 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @$inc_paths; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $resolved_file = $canidates[0]; 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (defined $resolved_file) { 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $resolved_file = File::Spec::Unix->canonpath($resolved_file); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $resolved_file; 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$help->{help} = << 'EOH'; 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhelp: Describe the usage of this program or its subcommands. 87324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverUsage: help [SUBCOMMAND...] 88324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEOH 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub help { 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($cmd) = @_; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (defined $cmd) { 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver print $help->{$cmd}; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say << 'EOH'; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverUsage: port <subcommand> [options] [args] 99324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEOH 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say "Available subcommands:"; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver foreach my $cmd (keys %$help) { 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say " $cmd"; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$help->{add} = << 'EOH'; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradd: Adds the file to the list of ported files. 110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverUsage: add PATH... 111324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEOH 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub add { 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($filename) = @_; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $port = YAML::Tiny->read('port.yml'); 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $status = $port->[0]->{status}; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!defined $status) { 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $status = $port->[0]->{status} = {}; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $path = resolve_file($filename); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!defined $path) { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver croak "File not found: $filename"; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $digest = sha1sum($path); 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $status->{$filename} = { 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'sha1' => $digest, 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $port->write('port.yml'); 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$help->{status} = << 'EOH'; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatus: Print the status of the ported files. 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusage: status [PATH...] 136324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEOH 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub status { 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $port = YAML::Tiny->read('port.yml'); 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $status = $port->[0]->{status}; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (my ($filename, $fstatus) = each (%$status)) { 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $path = resolve_file($filename); 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $digest = sha1sum($path); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($digest ne $fstatus->{sha1}) { 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say "M $filename"; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy ($cmd, @args) = @ARGV; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (defined $cmd) { 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $cmd_f = $commands->{$cmd}; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (defined $cmd_f) { 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $cmd_f->(@args); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say "Unknown command: '$cmd'"; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say "Type 'port help' for usage."; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exit 1; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse { 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver say "Type 'port help' for usage."; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exit 1; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__END__ 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 NAME 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverport - ANTLR Perl 5 port status 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 VERSION 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThis documentation refers to port version 0.0.1 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 USAGE 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver port help 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver port status 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 DESCRIPTION 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThe primary language target for ANTLR is Java. The Perl 5 port only follows 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis primary target language. This brings up the problem to follow the 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverchanges made to the primary target, by knowing I<what> has changed and I<how>. 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThis tool keeps a database of file paths and content checksum. Once the port 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverof a file (Java class, grammar, ...) is completed it is added to the 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdatabase (C<port add>). This database can then be queried to check what 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprimary files have changed (C<port status>). The revision control software 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvershould be helpful to determine the actual changes. 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 AUTHOR 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRonald Blaschke (ron@rblasch.org) 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204