X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=dupemerge;a=blobdiff_plain;f=dm6;h=a88c83e1d17ba04a21b04fcff8762b48301a66da;hp=44dcb9130318e4cad1c007a672f98fd5e6d88303;hb=de7efbca76dfc8ca745d8dabc2f9a99d9af0e4b4;hpb=b369878412e82690f14c5d0756f62dfd22f30431 diff --git a/dm6 b/dm6 index 44dcb91..a88c83e 100755 --- a/dm6 +++ b/dm6 @@ -7,8 +7,9 @@ use File::Compare; use File::Path; use File::Temp; use File::stat; +use MIME::Base64; -# Copyright (C) 2010 Zygo Blaxell +# Copyright (C) 2010 Zygo Blaxell # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -40,7 +41,7 @@ sub usage { Usage: $0 link-dir Hashes a NUL-separated list of files on stdin into link-dir. -Version: 20100513.0 +Version: 0.20100514 USAGE } @@ -103,6 +104,23 @@ 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, ''); + $base64_packed =~ y:/:_:; + # 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 +145,7 @@ while () { 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 +209,7 @@ while () { } # 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 +222,9 @@ while () { 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);