update readme and add gitignore
[client-tools.git] / tools / dataDirectoryDigestBuilder.pl
blob2abd3bf7dff27e1d143fb6303de7e2e825587602
1 #!/usr/bin/perl
3 use Digest::MD5 qw(md5_hex);
5 die "usage: perl buildTreeFileDigest.pl <config_file> <digest_name> [<old_digest_name>]\n" if (scalar(@ARGV) < 2 || scalar(@ARGV) > 3 || $ARGV[0] eq "-h" || $ARGV[0] eq "-?");
7 $configFile = shift;
8 $digest = shift;
10 sub numerically
12 return ($a <=> $b);
15 sub do_directory
17 local $_;
18 my $base = $_[0];
19 my $source = $_[1];
20 my $name = $_[2];
22 opendir(DIR, $source) || die "could not open source directory $source\n";
23 my @filenames = readdir(DIR);
24 closedir(DIR);
26 for (@filenames)
28 next if ($_ eq "." || $_ eq "..");
30 if (-d "$source/$_")
32 if ($name eq "")
34 &do_directory($base, "$source/$_", "$_");
36 else
38 &do_directory($base, "$source/$_", "$name/$_");
41 else
43 $count += 1;
44 print "." if ($count % 500 == 0);
46 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat("$source/$_");
48 my $md5sum = "";
50 if (defined $old{"$name/$_"})
52 ($oldName, $oldPath, $oldSize, $oldTime, $oldDigest) = split(/\s+/, $old{"$name/$_"}, 5);
53 if ($size == $oldSize && $mtime == $oldTime)
55 $md5sum = $oldDigest;
56 # print "cached $name/$_ '$md5sum'\n";
58 else
60 # print "changed $name/$_ !($size==$oldSize && $mtime==$oldTime)\n";
63 if ($md5sum eq "")
65 my $buffer;
66 open(FILE, "$source/$_") || die "could not spawn md5sum on file $source/$_";
67 binmode FILE;
68 read(FILE, $buffer, -s "$source/$_");
69 close(FILE);
70 $md5sum = md5_hex($buffer);
71 # print "compute $name/$_ $md5sum\n";
74 $files{"$name/$_"} = "$name/$_ $base $size $mtime $md5sum";
79 if (@ARGV)
81 open(DIGEST, shift) || die "could not open old digest file\n";
82 while (<DIGEST>)
84 chomp;
85 ($oldName, $oldPath, $oldSize, $oldTime, $oldDigest) = split(/\s+/, $_);
86 # print "caching $oldName: $_\n";
87 $old{$oldName} = $_;
89 close(DIGEST);
93 open(CONFIG, $configFile) || die "could not open config file $configFile\n";
94 while (<CONFIG>)
96 chomp;
98 if (/searchPath/)
100 s/^.*searchPath//;
101 s/\s+//;
102 push(@paths, $_);
105 close(CONFIG);
107 foreach (sort numerically @paths)
109 $count = 0;
110 ($priority, $path) = split(/=/);
111 print "processing $path($priority)";
112 do_directory($path, $path, "");
113 print "\n";
116 open(DIGEST, ">$digest");
117 foreach (sort keys %files)
119 print DIGEST $files{$_}, "\n";
121 close(DIGEST);