dm6: verbose output during garbage collection
[dupemerge] / dm6
diff --git a/dm6 b/dm6
index 44dcb9130318e4cad1c007a672f98fd5e6d88303..34bb654f41f9bf77c33e933557414e51e99c2a68 100755 (executable)
--- a/dm6
+++ b/dm6
@@ -7,6 +7,7 @@ use File::Compare;
 use File::Path;
 use File::Temp;
 use File::stat;
+use MIME::Base64;
 
 # Copyright (C) 2010 Zygo Blaxell <dm5@mailtoo.hungrycats.org>
 
@@ -103,6 +104,22 @@ sub prepare_parents {
        return "$parent/$suffix";
 }
 
+sub name_quad {
+       my ($int64) = @_;
+       my $packed = pack('Q', $int64);
+       $packed =~ s/^\0+//os;
+       my $base64_packed = encode_base64($packed, '');
+       # Don't strip off the trailing padding since it makes the string
+       # so short we end up just putting it back on again.
+       # $base64_packed =~ s/=+$//os;
+       return $base64_packed;
+}
+
+sub name_ino {
+       my ($ino) = @_;
+       return name_quad($ino) . 'I';
+}
+
 # ext3 cannot handle more than 32000 links to a file.  Leave some headroom.
 # Arguably this should be configurable, but the losses are miniscule and
 # the coding for option support is not.
@@ -127,7 +144,7 @@ while (<STDIN>) {
                        next if ($st->nlink > $link_count_max);
 
                        # Check link to inode
-                       my $inode_link = prepare_parents($link_dir, $st->ino . 'I');
+                       my $inode_link = prepare_parents($link_dir, name_ino($st->ino));
                        print STDERR 'I';
                        my $inode_st = lstat($inode_link);
                        my $update_links;
@@ -191,7 +208,7 @@ while (<STDIN>) {
                        }
 
                        # A link to the inode indicates we are done, so do it last
-                       $inode_link = prepare_parents($link_dir, "${keep_ino}I");
+                       $inode_link = prepare_parents($link_dir, name_ino($keep_ino));
                        print STDERR ' ';
                        link_files($digest_link, $inode_link);
 
@@ -204,9 +221,9 @@ while (<STDIN>) {
 print STDERR "\nGarbage collection in '$link_dir'...";
 chdir($link_dir) || die "chdir: $link_dir: $!";
 print STDERR "\nRemoving files with link count < 3...";
-system("find . -type f -links -3 -print0 | xargs -0 rm -f") and die "system: exit status $?";
+system("find . -type f -links -3 -print0 | xargs -0rt rm -f") and die "system: exit status $?";
 print STDERR "\nRemoving empty directories...";
-system("find . -type d -empty -print0 | xargs -0r rmdir -p --ignore-fail-on-non-empty") and die "system: exit status $?";
+system("find . -type d -empty -print0 | xargs -0rt rmdir -p --ignore-fail-on-non-empty") and die "system: exit status $?";
 print STDERR "\nDone.\n";
 
 exit(0);