X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=dupemerge;a=blobdiff_plain;f=dm6;h=2d554e3a9924cbf3810171cf924e1763d6cbda4c;hp=874534fac260f177fd174250296d0a872fb16aa3;hb=9d0ffbcf7b362b645d8a9ac012c43949ea9410ff;hpb=79c8d21ca871e2f52d8de960cbf2534ba4509491 diff --git a/dm6 b/dm6 index 874534f..2d554e3 100755 --- a/dm6 +++ b/dm6 @@ -63,7 +63,7 @@ sub link_files { unlink($tmp_to) or warn "unlink: $tmp_to: $!"; # Try, possibly in vain, to clean up die "rename: $tmp_to -> $from: $saved_bang"; } - print STDERR "\b \b"; + print STDERR "\b"; } my $link_dir = shift @ARGV; @@ -81,14 +81,25 @@ sub slash_prefix { return ($prefix, $suffix); } +sub mkdir_p { + my ($dir) = @_; + return if -d $dir; + $dir =~ s:/+$::os; + my $parent; + ($parent = $dir) =~ s:[^/]+$::os; + if ($parent ne $dir) { + mkdir_p($parent); + print STDERR 'm'; + mkdir($dir) or die "mkdir: $dir: $!"; + } + die "mkdir: $dir: $!" unless -d $dir; +} + sub prepare_parents { my ($link_dir, $file) = @_; my ($prefix, $suffix) = slash_prefix($file); my $parent = "$link_dir/$prefix"; - print STDERR 'm'; - mkpath($parent, { verbose => 0 }); - print STDERR "\b"; - die "mkpath: $parent: $!" unless -d $parent; + mkdir_p($parent); return "$parent/$suffix"; } @@ -159,7 +170,7 @@ while () { print STDERR "\b"; # Which file are we keeping? - my $keep_file; + my $keep_ino; # If digest link exists, link it to file if ($digest_st) { @@ -169,17 +180,18 @@ while () { # Old, replace input with old file print STDERR '-'; link_files($digest_link, $file); - $keep_file = $digest_link; + $keep_ino = $digest_st->ino; } else { # New, add input to digest print STDERR '+'; link_files($file, $digest_link); - $keep_file = $file; + $keep_ino = $st->ino; } # A link to the inode indicates we are done, so do it last - print STDERR '_'; - link_files($keep_file, $inode_link); + $inode_link = prepare_parents("$link_dir/inode", $keep_ino); + print STDERR ' '; + link_files($digest_link, $inode_link); } };