Index: lib/Brackup/Target/Filesystem.pm =================================================================== --- lib/Brackup/Target/Filesystem.pm (revision 163) +++ lib/Brackup/Target/Filesystem.pm (working copy) @@ -37,15 +37,24 @@ sub _diskpath { my ($self, $dig, $ext) = @_; - my @parts; my $fulldig = $dig; $dig =~ s/^\w+://; # remove the "hashtype:" from beginning $fulldig =~ s/:/./g if $self->{nocolons}; # Convert colons to dots if we've been asked to - while (length $dig && @parts < 4) { - $dig =~ s/^(.{1,4})//; - push @parts, $1; + + # Old (1.05 and earlier) Brackup uses four four-character directories. + # We don't want to re-write chunks if they already exist in those paths. + my @four_parts; + my $four_part_dig = $dig; + while (length $four_part_dig && @four_parts < 4) { + $four_part_dig =~ s/^(.{1,4})//; + push @four_parts, $1; } - return $self->{path} . "/" . join("/", @parts) . "/$fulldig.$ext"; + my $four_part_path = $self->{path} . "/" . join("/", @four_parts) + . "/$fulldig.$ext"; + return $four_part_path if stat $four_part_path; + + my @two_parts = (substr($dig, 0, 2), substr($dig, 2, 2)); + return $self->{path} . "/" . join("/", @two_parts) . "/$fulldig.$ext"; } sub chunkpath {