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