--- syncmail/folder.pm 2001/10/27 23:53:49 1.1 +++ syncmail/folder.pm 2001/10/28 03:51:24 1.2 @@ -2,6 +2,8 @@ BEGIN { *slog = \&::slog }; +use Digest::SHA1; + use constant MDIFVERSION => 1; sub new { @@ -93,12 +95,16 @@ } } elsif (/^\[DIFF (\d+)\]\n$/) { my $mtime = $1; - my @dif; + my (@add, @del); while (<$fh>) { - last unless /^[+-]/; - push @dif, substr $_, 0, -1; + last unless /^([+-])(.*)\n$/; + if ($1 eq "+") { + push @add, $2; + } else { + push @del, $2; + } } - unshift @{$self->{diff}}, [$mtime, \@dif]; + unshift @{$self->{diff}}, [$mtime, \@add, \@del]; } elsif ($_ eq "[INDEX]\n") { my @idx; while (<$fh>) { @@ -142,7 +148,8 @@ for (reverse @{$self->{diff}}) { print $fh "[DIFF $_->[0]]\n"; - print $fh $_, "\n" for @{$_->[1]}; + print $fh "+$_\n" for @{$_->[1]}; + print $fh "-$_\n" for @{$_->[2]}; } close $fh @@ -153,10 +160,23 @@ delete $self->{dirty}; } +if (1) { + use OpenSSL (); + *hash = \&OpenSSL::Digest::sha1_hex; +} elsif (0) { + # use Digest::SHA1; + my $digest = new Digest::SHA1; + *hash = sub { + $digest->reset; + $digest->add(@_); + $mid = $digest->hexdigest; + }; +} + sub gendiff { my ($d1, $d2) = @_; - my @d; + my (@add, @del); my (%d1, %d2); for (@$d2) { @@ -166,16 +186,16 @@ # delete msgs in d1 but not in d2 for (@$d1) { undef $d1{$_->[1]}; - push @d, "-$_->[1]" unless exists $d2{$_->[1]}; + push @del, $_->[1] unless exists $d2{$_->[1]}; } %d2 = (); # conserve memory # add msgs in d2 but not in d1 for (@$d2) { - push @d, "+$_->[1]" unless exists $d1{$_->[1]}; + push @add, $_->[1] unless exists $d1{$_->[1]}; } - \@d; + (\@add, \@del); } sub check { @@ -210,27 +230,17 @@ parse_mbox $path, sub { my ($offs, $head, $body) = @_; - my $mid; - if ($$head =~ /^Message-Id:\s*(<[^<\n]+>)\s*\n/im) { - $mid = $1; - } else { - $mid = MD5->hexhash("$$head\0$$body"); - } - push @idx, [$offs, $mid]; + push @idx, [$offs, hash($$head, "\0", $$body)]; } or return (); $self->read_mdif; - if ($self->{version}) { - my $d = gendiff $self->{idx}, \@idx; - push @{$self->{diff}}, [ - $self->{mtime}, - $d, - ] if @$d; - } else { - slog 2, "$path: previously unknown folder\n"; - $self->{version} ||= MDIFVERSION; - } + $self->{version} ||= MDIFVERSION; + my ($add, $del) = gendiff $self->{idx}, \@idx; + push @{$self->{diff}}, [ + $mtime, + $add, $del, + ] if @$add || @$del; $self->{fsize} = $fsize; $self->{mtime} = $mtime;