1
0
mirror of https://github.com/imapsync/imapsync.git synced 2024-11-17 00:02:29 +01:00
This commit is contained in:
Nick Bebout 2011-03-12 02:44:56 +00:00
parent 9372de1698
commit 250d6fab28
7 changed files with 350 additions and 264 deletions

View File

@ -1,17 +1,26 @@
RCS file: RCS/imapsync,v
Working file: imapsync
head: 1.331
head: 1.333
branch:
locks: strict
gilles: 1.331
gilles: 1.333
access list:
symbolic names:
keyword substitution: kv
total revisions: 331; selected revisions: 331
total revisions: 333; selected revisions: 333
description:
----------------------------
revision 1.331 locked by: gilles;
revision 1.333 locked by: gilles;
date: 2010/07/14 23:55:13; author: gilles; state: Exp; lines: +7 -9
docfix
----------------------------
revision 1.332
date: 2010/07/14 23:09:02; author: gilles; state: Exp; lines: +251 -178
Reviewed variable names.
Began to push subroutines below main.
----------------------------
revision 1.331
date: 2010/07/13 23:28:59; author: gilles; state: Exp; lines: +6 -6
default values for h1_mess_duplicate h1_mess_size_total_duplicate
----------------------------

4
README
View File

@ -3,7 +3,7 @@ NAME
Synchronise mailboxes between two imap servers. Good at IMAP migration.
More than 32 different IMAP server softwares supported with success.
$Revision: 1.331 $
$Revision: 1.333 $
INSTALL
imapsync works fine under any Unix OS with perl.
@ -377,5 +377,5 @@ SIMILAR SOFTWARES
Feedback (good or bad) will always be welcome.
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $

2
TIME
View File

@ -1,3 +1,5 @@
250 Reviewed varaibles names, statistics, sub definitions from top to connect_imap()
120 W3C validation of web site
120 --pidfile option. die_clean() exit_clean()
120 reconnect counter, --debugimap1 --debugimap2

View File

@ -1 +1 @@
1.331
1.333

433
imapsync
View File

@ -1,5 +1,15 @@
#!/usr/bin/perl
# structure
# pod documentation
# pragmas
# main program
# global variables initialisation
# default values
# subroutines
# IMAPClient 2.2.9 overrides
# IMAPClient 2.2.9 3.xx ads
=pod
=head1 NAME
@ -9,7 +19,7 @@ tool. Synchronise mailboxes between two imap servers. Good
at IMAP migration. More than 32 different IMAP server softwares
supported with success.
$Revision: 1.331 $
$Revision: 1.333 $
=head1 INSTALL
@ -434,10 +444,13 @@ Entries for imapsync:
Feedback (good or bad) will always be welcome.
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $
=cut
# pragmas
use warnings;
++$|;
use strict;
@ -456,16 +469,15 @@ use File::Path qw(mkpath rmtree);
use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE);
use Errno qw(EAGAIN EPIPE ECONNRESET);
#use Test::Simple tests => 1;
use Test::More 'no_plan';
eval { require 'usr/include/sysexits.ph' };
# global variables
my(
$rcs, $pidfile,
$debug, $debugimap, $debugimap1, $debugimap2, $error,
$debug, $debugimap, $debugimap1, $debugimap2, $nb_errors,
$host1, $host2, $port1, $port2,
$user1, $user2, $password1, $password2, $passfile1, $passfile2,
@folder, @include, @exclude, @folderrec,
@ -484,15 +496,21 @@ my(
$justfoldersizes,
$authmd5,
$subscribed, $subscribe, $subscribe_all,
$version, $VERSION, $help,
$version, $help,
$justconnect, $justfolders, $justbanner,
$fast,
$mess_size_total_trans,
$mess_size_total_skipped,
$mess_size_total_error,
$mess_trans, $mess_skipped, $mess_skipped_dry,
$h1_mess_duplicate, $h1_mess_size_total_duplicate,
$h1_mess_deleted, $h2_mess_deleted,
$total_bytes_transferred,
$total_bytes_skipped,
$total_bytes_error,
$nb_msg_transferred,
$nb_msg_skipped,
$nb_msg_skipped_dry_mode,
$h1_nb_msg_duplicate,
$h2_nb_msg_duplicate,
$h1_total_bytes_duplicate,
$h2_total_bytes_duplicate,
$h1_nb_msg_deleted,
$h2_nb_msg_deleted,
$timeout,
$timestart, $timeend, $timediff,
$timesize, $timebefore,
@ -507,153 +525,54 @@ my(
$tmpdir,
);
$rcs = '$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $ ';
$rcs =~ m/,v (\d+\.\d+)/;
$VERSION = ($1) ? $1: "UNKNOWN";
# main program
my $VERSION_IMAPClient = $Mail::IMAPClient::VERSION;
# global variables initialisation
$mess_size_total_trans = 0;
$mess_size_total_skipped = 0;
$mess_size_total_error = 0;
$mess_trans = $mess_skipped = $mess_skipped_dry = 0;
$h1_mess_deleted = $h2_mess_deleted = 0;
$h1_mess_duplicate = $h1_mess_size_total_duplicate = 0;
$rcs = '$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $ ';
$total_bytes_transferred = 0;
$total_bytes_skipped = 0;
$total_bytes_error = 0;
$nb_msg_transferred = 0;
$nb_msg_skipped = $nb_msg_skipped_dry_mode = 0;
$h1_nb_msg_deleted = $h2_nb_msg_deleted = 0;
$h1_nb_msg_duplicate = $h2_nb_msg_duplicate =0;
$h1_total_bytes_duplicate = $h2_total_bytes_duplicate = 0;
sub check_lib_version {
$debug and print "VERSION_IMAPClient $VERSION_IMAPClient\n";
if ($VERSION_IMAPClient eq '2.2.9') {
override_imapclient();
return(1);
}
else{
# 3.x.x is no longer buggy with imapsync.
if ($allow3xx) {
return(1);
}else{
return(0);
}
}
}
$error=0;
sub modules_VERSION() {
no warnings 'uninitialized';
my $modules_releases = "
Mail::IMAPClient $Mail::IMAPClient::VERSION
IO::Socket $IO::Socket::VERSION
IO::Socket::SSL $IO::Socket::SSL::VERSION
Digest::MD5 $Digest::MD5::VERSION
Digest::HMAC_MD5 $Digest::HMAC_MD5::VERSION
Term::ReadKey $Term::ReadKey::VERSION
Date::Manip $Date::Manip::VERSION
";
return($modules_releases);
}
# Construct a command line copy with passwords replaced by MASKED.
my @argv_nopassord;
my @argv_copy = @ARGV;
while (@argv_copy) {
my $arg = shift(@argv_copy);
if ($arg =~ m/-password[12]/) {
shift(@argv_copy);
push(@argv_nopassord, $arg, "MASKED");
}else{
push(@argv_nopassord, $arg);
}
}
my $banner_imapsync = join("",
'$RCSfile: imapsync,v $ ',
'$Revision: 1.331 $ ',
'$Date: 2010/07/13 23:28:59 $ ',
"\n",localhost_info(), "\n",
"Command line used:\n",
"$0 @argv_nopassord\n",
);
$nb_errors = 0;
unless(defined(&_SYSEXITS_H)) {
# 64 on my linux box.
eval 'sub EX_USAGE () {64;}' unless defined(&EX_USAGE);
}
# @ARGV will be eat by get_options
my @argv_copy = @ARGV;
get_options();
sub write_pidfile {
my $pidfile = shift;
print "PID file is $pidfile\n";
if (-e $pidfile) {
warn "$pidfile already exists, overwriting it\n";
}
open(PIDFILE, ">$pidfile") or do {
warn "Could not open $pidfile for writing";
return undef;
};
print PIDFILE $PROCESS_ID;
close PIDFILE;
return($PROCESS_ID);
}
# default values
$tmpdir ||= File::Spec->tmpdir();
$pidfile ||= $tmpdir . '/imapsync.pid';
sub check_dir {
my $dir = shift;
return(1) if (-d $dir and -r _ and -w _);
# Trying to create it
mkpath($dir) or die "Error creating tmpdir $tmpdir : $!";
die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _);
return(1);
}
# allow Mail::IMAPClient 3.0.xx by default
$allow3xx = defined($allow3xx) ? $allow3xx : 1;
check_lib_version() or
die "imapsync needs perl lib Mail::IMAPClient release 2.2.9, or 3.0.25 or superior \n";
print banner_imapsync(@argv_copy);
print $banner_imapsync;
print "Temp directory is $tmpdir\n";
check_dir($tmpdir);
is_valid_directory($tmpdir);
write_pidfile($pidfile) if ($pidfile);
print "Modules version list:\n", modules_VERSION(), "\n";
exit_clean(0) if ($justbanner);
sub exit_clean {
my $status = shift;
unlink($pidfile);
exit($status);
}
sub die_clean {
unlink($pidfile);
die @_;
}
sub missing_option {
my ($option) = @_;
die_clean "$option option must be used, run $0 --help for help\n";
}
# By default, 1000 at a time, not more.
$split1 ||= 1000;
$split2 ||= 1000;
@ -1232,7 +1151,7 @@ sub foldersizes {
warn
"$side Folder $folder: Could not select: ",
$imap->LastError, "\n";
$error++;
$nb_errors++;
next;
}
if (defined($maxage) or defined($minage)) {
@ -1596,7 +1515,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
warn
"Host1 Folder $h1_fold: Could not select: ",
$imap1->LastError, "\n";
$error++;
$nb_errors++;
next FOLDER;
}
@ -1607,7 +1526,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
unless ($imap2->create($h2_fold)){
warn "Couldn't create [$h2_fold]: ",
$imap2->LastError,"\n";
$error++;
$nb_errors++;
next FOLDER;
}
}
@ -1622,7 +1541,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
warn
"Host2 folder $h2_fold: Could not select: ",
$imap2->LastError, "\n";
$error++;
$nb_errors++;
next FOLDER;
}
my @select_results = $imap2->Results();
@ -1649,10 +1568,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
my @h1_msgs = select_msgs($imap1);
$debug and print "LIST Host1: ", scalar(@h1_msgs), " messages [@h1_msgs]\n";
# internal dates on "TO" are after the ones on "FROM"
# internal dates on host2 are after the ones on host1
# normally...
my @h2_msgs = select_msgs($imap2);
@ -1679,7 +1596,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
warn
"Host1 Folder $h1_fold: Could not fetch_hash ",
scalar(@h1_msgs), " msgs: ", $imap1->LastError, "\n";
$error++;
$nb_errors++;
next FOLDER;
}
last FOLDER if $imap1->IsUnconnected();
@ -1691,15 +1608,15 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
if (! defined($rc)) {
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
print "+ Skipping msg #$m:$h1_size on host1 folder $h1_fold (no header so we ignore this message)\n";
$mess_size_total_skipped += $h1_size;
$mess_skipped += 1;
$total_bytes_skipped += $h1_size;
$nb_msg_skipped += 1;
} elsif(0 == $rc) {
# duplicate
push(@h1_msgs_duplicate, $m);
# duplicate, same id same size?
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
$h1_mess_size_total_duplicate += $h1_size;
$h1_mess_duplicate += 1;
$h1_total_bytes_duplicate += $h1_size;
$h1_nb_msg_duplicate += 1;
}
}
$debug and print "Time parsing headers on host1: ", timenext(), " s\n";
@ -1724,6 +1641,9 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold (no header so we ignore this message)\n";
} elsif(0 == $rc) {
# duplicate
my $h2_size = $h2_fir->{$m}->{"RFC822.SIZE"} || 0;
$h2_nb_msg_duplicate += 1;
$h2_total_bytes_duplicate += $h2_size;
push(@h2_msgs_duplicate, $m);
}
}
@ -1754,7 +1674,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
push(@h2_expunge, $h2_msg) if $uidexpunge2;
unless ($dry or $isdel) {
$imap2->delete_message($h2_msg);
$h2_mess_deleted += 1;
$h2_nb_msg_deleted += 1;
}
}
}
@ -1763,7 +1683,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
push(@h2_expunge, $h2_msg) if $uidexpunge2;
unless ($dry) {
$imap2->delete_message($h2_msg);
$h2_mess_deleted += 1;
$h2_nb_msg_deleted += 1;
}
}
@ -1784,8 +1704,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
if (defined $maxsize and $h1_size > $maxsize) {
print "+ Skipping msg #$h1_msg:$h1_size in host1 folder $h1_fold (exceeds maxsize limit $maxsize bytes)\n";
$mess_size_total_skipped += $h1_size;
$mess_skipped += 1;
$total_bytes_skipped += $h1_size;
$nb_msg_skipped += 1;
next MESS;
}
$debug and print "+ key $m_id #$h1_msg\n";
@ -1801,8 +1721,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
warn
"Could not fetch message #$h1_msg from $h1_fold: ",
$imap1->LastError, "\n";
$error++;
$mess_size_total_error += $h1_size;
$nb_errors++;
$total_bytes_error += $h1_size;
next MESS;
}
@ -1812,8 +1732,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
#$imap1->message_to_file($message_file, $h1_msg) or do {
# warn "Could not put message #$h1_msg to file $message_file",
# $imap1->LastError;
# $error++;
# $mess_size_total_error += $h1_size;
# $nb_errors++;
# $total_bytes_error += $h1_size;
# next MESS;
#};
#$string = file_to_string($message_file);
@ -1959,8 +1879,8 @@ Bye.'
warn "Couldn't append msg #$h1_msg (Subject:[".
$imap1->subject($h1_msg)."]) to folder $h2_fold: ",
$imap2->LastError, "\n";
$error++;
$mess_size_total_error += $h1_size;
$nb_errors++;
$total_bytes_error += $h1_size;
next MESS;
}
else{
@ -1968,13 +1888,13 @@ Bye.'
# $new_id is an id if the IMAP server has the
# UIDPLUS capability else just a ref
print "Copied msg id [$h1_msg] to folder $h2_fold msg id [$new_id]\n";
$mess_size_total_trans += $h1_size;
$mess_trans += 1;
$total_bytes_transferred += $h1_size;
$nb_msg_transferred += 1;
if($delete) {
print "Deleting msg #$h1_msg in host1 folder $h1_fold\n";
print "Deleting msg #$h1_msg on host1 folder $h1_fold\n";
unless($dry) {
$imap1->delete_message($h1_msg);
$h1_mess_deleted += 1;
$h1_nb_msg_deleted += 1;
last FOLDER if $imap1->IsUnconnected();
$imap1->expunge() if ($expunge);
last FOLDER if $imap1->IsUnconnected();
@ -1983,15 +1903,15 @@ Bye.'
}
}
else{
$mess_skipped_dry += 1;
$nb_msg_skipped_dry_mode += 1;
}
#unlink($message_file);
next MESS;
}
else{
$debug and print "Message id [$m_id] found in t:$h2_fold\n";
$mess_size_total_skipped += $h1_size;
$mess_skipped += 1;
$total_bytes_skipped += $h1_size;
$nb_msg_skipped += 1;
}
$fast and next MESS;
@ -2025,7 +1945,7 @@ Bye.'
warn "Could not add flags @h1_flags",
" on msg #$h2_msg in $h2_fold: ",
$imap2->LastError, "\n";
#$error++;
#$nb_errors++;
}
last FOLDER if $imap2->IsUnconnected();
@ -2053,17 +1973,17 @@ Bye.'
# Bad size
print
"Message $m_id SZ_BAD f:$h1_msg:$h1_size t:$h2_msg:$h2_size\n";
$error++;
$nb_errors++;
}
else {
# Good
$debug and print
"Message $m_id SZ_GOOD f:$h1_msg:$h1_size t:$h2_msg:$h2_size\n";
if($delete) {
print "Deleting msg #$h1_msg in host1 folder $h1_fold\n";
print "Deleting msg #$h1_msg on host1 folder $h1_fold\n";
unless($dry) {
$imap1->delete_message($h1_msg);
$h1_mess_deleted += 1;
$h1_nb_msg_deleted += 1;
$imap1->expunge() if ($expunge);
}
}
@ -2106,7 +2026,7 @@ sub _filter {
sub lost_connection {
my($imap, $error_message) = @_;
if ( $imap->IsUnconnected() ) {
$error++;
$nb_errors++;
my $lcomm = $imap->LastIMAPCommand || "";
my $einfo = $imap->LastError || @{$imap->History}[-1] || "";
@ -2133,10 +2053,156 @@ $timediff = $timeend - $timestart;
stats();
exit_clean(1) if($error);
exit_clean(1) if($nb_errors);
exit_clean(0);
# END of main program
# subroutines
sub imapsync_version {
my $rcs = '$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $ ';
$rcs =~ m/,v (\d+\.\d+)/;
my $VERSION = ($1) ? $1: "UNKNOWN";
return($VERSION);
}
sub check_lib_version {
$debug and print "IMAPClient $Mail::IMAPClient::VERSION\n";
if ($Mail::IMAPClient::VERSION eq '2.2.9') {
override_imapclient();
return(1);
}
else{
# 3.x.x is no longer buggy with imapsync.
if ($allow3xx) {
return(1);
}else{
return(0);
}
}
}
sub modules_VERSION {
my @list_version;
foreach my $module (qw(
Mail::IMAPClient
IO::Socket
IO::Socket::SSL
Digest::MD5
Digest::HMAC_MD5
Term::ReadKey
Date::Manip))
{
my $v = "?";
if (eval "require $module") {
# module is here
$v = eval "\$${module}::VERSION";
}else{
# no module
$v = "?";
}
#print ("$module ", $v, "\n");
push (@list_version, sprintf("%-20s %s\n", $module, $v));
}
return(@list_version);
}
# Construct a command line copy with passwords replaced by MASKED.
sub command_line_nopassword {
my @argv_copy = @_;
my @argv_nopassword;
while (@argv_copy) {
my $arg = shift(@argv_copy); # option name or value
if ($arg =~ m/-password[12]/) {
shift(@argv_copy); # password value
push(@argv_nopassword, $arg, "MASKED"); # option name and fake value
}else{
push(@argv_nopassword, $arg); # same option or value
}
}
return("@argv_nopassword");
}
sub tests_command_line_nopassword {
ok('' eq command_line_nopassword(), 'command_line_nopassword void');
ok('--blabla' eq command_line_nopassword('--blabla'), 'command_line_nopassword --blabla');
#print command_line_nopassword((qw{ --password1 secret1 })), "\n";
ok('--password1 MASKED' eq command_line_nopassword(qw{ --password1 secret1}), 'command_line_nopassword --password1');
ok('--blabla --password1 MASKED --blibli'
eq command_line_nopassword(qw{ --blabla --password1 secret1 --blibli }), 'command_line_nopassword --password1 --blibli');
}
sub banner_imapsync {
my @argv_copy = @_;
my $banner_imapsync = join("",
'$RCSfile: imapsync,v $ ',
'$Revision: 1.333 $ ',
'$Date: 2010/07/14 23:55:13 $ ',
"\n",localhost_info(), "\n",
"Command line used:\n",
"$0 ", command_line_nopassword(@argv_copy), "\n",
);
}
sub is_valid_directory {
my $dir = shift;
return(1) if (-d $dir and -r _ and -w _);
# Trying to create it
mkpath($dir) or die "Error creating tmpdir $tmpdir : $!";
die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _);
return(1);
}
sub write_pidfile {
my $pidfile = shift;
print "PID file is $pidfile\n";
if (-e $pidfile) {
warn "$pidfile already exists, overwriting it\n";
}
open(PIDFILE, ">$pidfile") or do {
warn "Could not open $pidfile for writing";
return undef;
};
print PIDFILE $PROCESS_ID;
close PIDFILE;
return($PROCESS_ID);
}
sub exit_clean {
my $status = shift;
unlink($pidfile);
exit($status);
}
sub die_clean {
unlink($pidfile);
die @_;
}
sub missing_option {
my ($option) = @_;
die_clean("$option option must be used, run $0 --help for help\n");
}
sub select_msgs {
my ($imap) = @_;
my (@msgs,@max,@min,@union,@inter);
@ -2169,31 +2235,33 @@ sub select_msgs {
sub stats {
print "++++ Statistics ++++\n";
print "Time : $timediff sec\n";
print "Messages transferred : $mess_trans ";
print "(could be $mess_skipped_dry without dry mode)" if ($dry);
print "Transfer time : $timediff sec\n";
print "Messages transferred : $nb_msg_transferred ";
print "(could be $nb_msg_skipped_dry_mode without dry mode)" if ($dry);
print "\n";
print "Messages skipped : $mess_skipped\n";
print "Messages duplicate on host1 : $h1_mess_duplicate\n";
print "Messages deleted on host1 : $h1_mess_deleted\n";
print "Messages deleted on host2 : $h2_mess_deleted\n";
print "Total bytes transferred : $mess_size_total_trans\n";
print "Total bytes duplicate host1 : $h1_mess_size_total_duplicate\n";
print "Total bytes skipped : $mess_size_total_skipped\n";
print "Total bytes error : $mess_size_total_error\n";
print "Messages skipped : $nb_msg_skipped\n";
print "Messages duplicate on host1 : $h1_nb_msg_duplicate\n";
print "Messages duplicate on host2 : $h2_nb_msg_duplicate\n";
print "Messages deleted on host1 : $h1_nb_msg_deleted\n";
print "Messages deleted on host2 : $h2_nb_msg_deleted\n";
print "Total bytes transferred : $total_bytes_transferred\n";
print "Total bytes duplicate host1 : $h1_total_bytes_duplicate\n";
print "Total bytes duplicate host2 : $h2_total_bytes_duplicate\n";
print "Total bytes skipped : $total_bytes_skipped\n";
print "Total bytes error : $total_bytes_error\n";
$timediff ||= 1; # No division per 0
printf ("Average bandwidth rate : %.1f KiB/s\n", $mess_size_total_trans / 1024 / $timediff);
printf ("Message rate : %.1f messages/s\n", $nb_msg_transferred / $timediff);
printf ("Average bandwidth rate : %.1f KiB/s\n", $total_bytes_transferred / 1024 / $timediff);
print "Reconnections to host1 : $host1_reconnect_count\n";
print "Reconnections to host2 : $host2_reconnect_count\n";
print "Detected $error errors\n\n";
print "Detected $nb_errors errors\n\n";
print thank_author();
}
sub thank_author {
return(join("", "Happy with this free, open and gratis DWTFPL software?\n",
"Encourage the author (Gilles LAMIRAL) by giving him a book:\n",
"http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/\n",
"Encourage the author (Gilles LAMIRAL) by giving him a book\n",
"or just money via paypal:\n",
"http://www.linux-france.org/prj/imapsync/\n"));
}
@ -2292,7 +2360,7 @@ sub get_options {
$debug and print "get options: [$opt_ret]\n";
# just the version
print "$VERSION\n" and exit if ($version) ;
print imapsync_version(), "\n" and exit if ($version) ;
if ($tests) {
$test_builder->no_ending(0);
@ -2615,9 +2683,12 @@ sub tests {
tests_permanentflags();
tests_flags_filter();
tests_imap2_folder_name();
tests_command_line_nopassword();
}
}
# IMAPClient 2.2.9 overrides
sub override_imapclient {
no warnings 'redefine';
no strict 'subs';
@ -3714,7 +3785,7 @@ sub starttls {
$banner;
}
# IMAPClient 2.2.9 3.xx ads
package Mail::IMAPClient;

View File

@ -2,10 +2,10 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>imapsync</title>
<title>imapsync <!--#exec cmd="cat VERSION" --> </title>
<meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/>
<meta name="date" content="2010-07-14T15:55:32+0200"/>
<meta name="date" content="2010-07-15T02:06:30+0200"/>
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfert, migration"/>
<meta name="description" content="imap migration tool"/>
@ -47,8 +47,8 @@ recursive <b>imap</b> transfers from one mailbox to another.
imapsync mailing-list (see below).</p>
<p>Gilles LAMIRAL earns his living writing, installing, configuring and
teaching free, open and gratis softwares. Do not hesitate to pay him for
that services.</p>
teaching free, open and gratis softwares. <br/>
Do not hesitate to pay him for that services.</p>
<p>If you <b>use imapsync</b> as a <b>professionnal worker</b> you may
<b><a href="http://www.linux-france.org/prj/imapsync_list/msg00470.html">read this call</a></b>
@ -57,7 +57,7 @@ recursive <b>imap</b> transfers from one mailbox to another.
<h2>imapsync donation</h2>
<p>Happy with this <b>free</b>, <b>open</b> and <b>gratis</b> software?<br/></p>
<p>Help the author to maintain imapsync and support users:</p>
<p><b>Help</b> the author to <b>maintain</b> imapsync and <b>support</b> users:</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<p>
@ -161,9 +161,8 @@ If you really want a feature you can donate money and I'll code it.<br/>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
This document last modified <!--#echo var="LAST_MODIFIED" --> <br/>
$Id: index.shtml,v 1.9 2010/07/14 13:56:44 gilles Exp gilles $
$Id: index.shtml,v 1.10 2010/07/15 00:06:46 gilles Exp gilles $
</p>
</body>
</html>

143
tests.sh
View File

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: tests.sh,v 1.105 2010/07/12 00:14:00 gilles Exp gilles $
# $Id: tests.sh,v 1.106 2010/07/14 23:25:14 gilles Exp gilles $
# Example:
# CMD_PERL='perl -I./Mail-IMAPClient-3.14/lib' sh -x tests.sh
@ -40,7 +40,7 @@ run_tests() {
for t in "$@"; do
test_count=`expr 1 + $test_count`
run_test "$t"
sleep 1
#sleep 1
done
}
@ -1286,9 +1286,80 @@ genomics() {
##########################
##########################
# Tests list
mandatory_tests='
no_args
option_version
option_tests
option_bad_delete2
first_sync_dry
first_sync
locallocal
ll_pidfile
ll_ask_password
ll_bug_folder_name_with_blank
ll_timeout
ll_folder
ll_buffersize
ll_justfolders
ll_prefix12
ll_internaldate
ll_idatefromheader
ll_folder_rev
ll_subscribed
ll_subscribe
ll_justfoldersizes
ll_authmd5
ll_noauthmd5
ll_maxage
ll_maxsize
ll_skipsize
ll_skipheader
ll_include
ll_exclude
ll_regextrans2
ll_sep2
ll_bad_login
ll_bad_host
ll_bad_host_ssl
ll_justfoldersizes
ll_useheader
ll_regexmess
ll_regexmess_scwchu
ll_flags
ll_regex_flag
ll_regex_flag_keep_only
ll_justconnect
ll_justlogin
ll_ssl
ll_ssl_justconnect
ll_ssl_justlogin
ll_tls_justconnect
ll_tls_justlogin
ll_tls
ll_authmech_PLAIN
ll_authmech_LOGIN
ll_authmech_CRAMMD5
ll_authuser
ll_delete2
ll_delete
ll_folderrec
ll_bigmail
gmail
gmail_gmail
gmail_gmail2
archiveopteryx_1
allow3xx
noallow3xx'
other_tests='
msw
ll_justlogin_backslash_char'
l() {
echo "$mandatory_tests" "$other_tests"
}
# mandatory tests
@ -1296,73 +1367,7 @@ run_tests perl_syntax
# All tests
test $# -eq 0 && run_tests \
no_args \
option_version \
option_tests \
option_bad_delete2 \
first_sync_dry \
first_sync \
locallocal \
ll_pidfile \
ll_ask_password \
ll_bug_folder_name_with_blank \
ll_timeout \
ll_folder \
ll_buffersize \
ll_justfolders \
ll_prefix12 \
ll_internaldate \
ll_idatefromheader \
ll_folder_rev \
ll_subscribed \
ll_subscribe \
ll_justfoldersizes \
ll_authmd5 \
ll_noauthmd5 \
ll_maxage \
ll_maxsize \
ll_skipsize \
ll_skipheader \
ll_include \
ll_exclude \
ll_regextrans2 \
ll_sep2 \
ll_bad_login \
ll_bad_host \
ll_bad_host_ssl \
ll_justfoldersizes \
ll_useheader \
ll_regexmess \
ll_regexmess_scwchu \
ll_flags \
ll_regex_flag \
ll_regex_flag_keep_only \
ll_justconnect \
ll_justlogin \
ll_ssl \
ll_ssl_justconnect \
ll_ssl_justlogin \
ll_tls_justconnect \
ll_tls_justlogin \
ll_tls \
ll_authmech_PLAIN \
ll_authmech_LOGIN \
ll_authmech_CRAMMD5 \
ll_authuser \
ll_delete2 \
ll_delete \
ll_folderrec \
ll_bigmail \
gmail \
gmail_gmail \
gmail_gmail2 \
archiveopteryx_1 \
allow3xx \
noallow3xx \
# msw
# ll_justlogin_backslash_char
test $# -eq 0 && run_tests $mandatory_tests
# selective tests