#!/usr/bin/env perl

use strict;
use warnings;

sub main {
    my %hashes;
    if (@_ && -f $_[0]){
        my $file = shift;
        open(my $fh, '<', $file) || die("Couldn't open $file: $!");
        while (my $line = <$fh>){
            chomp($line);
            if ($line =~ /^(\S+) (.*?)$/){
                my ($sum, $file) = ($1, $2);
                $hashes{$sum} ||= [];
                push(@{$hashes{$sum}}, $file);
            } else {
                die("Couldn't parse $line");
            }
        }
        close($fh);
    } else {
        my @directories = @_;
        unless (@directories){
            @directories = ('.');
        }

        for my $d (@directories){
            $d =~ s/'/\\'/g;
            my @lines = split("\n", `find '$d' -type f -not -path '*/build/*' -exec md5sum {} +`);
            for my $line (@lines){
                chomp($line);
                if ($line =~ /^(\S+) (.*?)$/){
                    my ($sum, $file) = ($1, $2);
                    $hashes{$sum} ||= [];
                    push(@{$hashes{$sum}}, $file);
                } else {
                    die("Couldn't parse $line");
                }
            }
        }
    }

    while (my ($sum, $files) = each(%hashes)){
        if (@$files > 1){
            print "The following files have the same checksum ($sum):\n\t";
            print join("\n\t", @$files);
            print "\n";
        }
    }
    return;
}

unless (caller){
    exit(main(@ARGV) || 0);
}

