sub link_files {
my ($from, $to) = (@_);
- print STDERR "link '$from' '$to' ...";
+ print STDERR 'T';
my $inode_dir = $to;
my $inode_base = $to;
$inode_dir =~ s:[^/]*$::o;
$inode_base =~ s:^.*/::os;
my $tmp_to = File::Temp::tempnam($inode_dir, ".$inode_base.");
+ print STDERR "\bL";
link($from, $tmp_to) or die "link: $from -> $tmp_to: $!";
+ print STDERR "\bR";
unless (rename($tmp_to, $to)) {
my $saved_bang = $!;
+ print STDERR "\bU";
unlink($tmp_to) or warn "unlink: $tmp_to: $!"; # Try, possibly in vain, to clean up
die "rename: $tmp_to -> $from: $saved_bang";
}
- print STDERR "\n";
+ print STDERR "\b \b";
}
my $link_dir = shift @ARGV;
my ($link_dir, $file) = @_;
my ($prefix, $suffix) = slash_prefix($file);
my $parent = "$link_dir/$prefix";
- mkpath($parent, { verbose => 1 });
+ print STDERR 'm';
+ mkpath($parent, { verbose => 0 });
+ print STDERR "\b";
die "mkpath: $parent: $!" unless -d $parent;
return "$parent/$suffix";
}
chomp $file;
# Get file stat data
+ print STDERR '.';
my $st = lstat($file);
die "lstat: $file: $!" unless $st;
# Check link to inode
my $inode_link = prepare_parents("$link_dir/inode", $st->ino);
+ print STDERR 'I';
my $inode_st = lstat($inode_link);
my $update_links;
if ($inode_st) {
} else {
$update_links = 1;
}
+ print STDERR "\b";
# If neither criteria for updating link is met, leave it as-is
next unless $update_links;
# Compute digest
- print STDERR "digest($file) = ";
+ print STDERR 'd';
my $digest = digest($file);
+ print STDERR "\b";
# Base64 uses /, we prefer _
$digest =~ y:/:_:;
- print STDERR "$digest\n";
-
# Check link to digest
my $digest_link = prepare_parents("$link_dir/digest", $digest);
+ print STDERR 'D';
my $digest_st = lstat($digest_link);
if ($digest_st) {
my $digest_nlink = $digest_st->nlink;
if ($digest_nlink > 31990) {
- print STDERR "Removing '$digest_link' with $digest_nlink links\n";
+ print STDERR 'u';
unlink($digest_link) or die "unlink: $digest_link: $!";
undef $digest_st;
}
# If digest link exists, link it to file
if ($digest_st) {
- print STDERR "cmp '$digest_link' '$file' ...";
+ print STDERR 'c';
die "NOT identical!" if compare($digest_link, $file);
- print STDERR "\n";
+
+ # Old, replace input with old file
+ print STDERR '-';
link_files($digest_link, $file);
} else {
+ # New, add input to digest
+ print STDERR '+';
link_files($file, $digest_link);
}