From f864a2cb1018c7415a3775cc0e480d5f4fad3c0a Mon Sep 17 00:00:00 2001 From: Nick Bebout Date: Sat, 12 Mar 2011 02:44:50 +0000 Subject: [PATCH] 1.299 --- COPYING | 14 ++ ChangeLog | 33 +++- GPL | 339 ---------------------------------------- INSTALL | 8 +- Makefile | 10 +- README | 12 +- TODO | 23 +-- VERSION | 2 +- freshmeat_submition.out | 10 +- imapsync | 133 +++++++++++++--- learn/file_spec | 14 ++ tests.sh | 6 +- 12 files changed, 210 insertions(+), 394 deletions(-) create mode 100644 COPYING delete mode 100644 GPL create mode 100755 learn/file_spec diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..2978491 --- /dev/null +++ b/COPYING @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + 14 rue de Plaisance, 75014 Paris, France + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/ChangeLog b/ChangeLog index adf2e10..6a680bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,42 @@ RCS file: RCS/imapsync,v Working file: imapsync -head: 1.293 +head: 1.299 branch: locks: strict - gilles: 1.293 + gilles: 1.299 access list: symbolic names: keyword substitution: kv -total revisions: 293; selected revisions: 293 +total revisions: 299; selected revisions: 299 description: ---------------------------- -revision 1.293 locked by: gilles; +revision 1.299 locked by: gilles; +date: 2010/01/15 00:19:32; author: gilles; state: Exp; lines: +10 -10 +imapsync is no longer GPL software. +imapsync is WTFPL software. The best licence I found. +---------------------------- +revision 1.298 +date: 2010/01/14 23:43:22; author: gilles; state: Exp; lines: +6 -8 +Fix. Removed identical "my" declaration. +---------------------------- +revision 1.297 +date: 2010/01/14 17:36:17; author: gilles; state: Exp; lines: +13 -11 +Rewrote flags_filter(), same behavior, no regex. +---------------------------- +revision 1.296 +date: 2010/01/14 16:57:58; author: gilles; state: Exp; lines: +72 -8 +Filter flags sync with the list given by PERMANENTFLAGS on --host2 +---------------------------- +revision 1.295 +date: 2010/01/14 15:04:27; author: gilles; state: Exp; lines: +10 -6 +--expunge only expunge --host1 (fixed output about that) +---------------------------- +revision 1.294 +date: 2010/01/14 02:12:17; author: gilles; state: Exp; lines: +37 -10 +Added --tmpdir option. The funny part is it's useless now. +---------------------------- +revision 1.293 date: 2010/01/12 05:34:27; author: gilles; state: Exp; lines: +6 -6 Change call for donation. ---------------------------- diff --git a/GPL b/GPL deleted file mode 100644 index a43ea21..0000000 --- a/GPL +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/INSTALL b/INSTALL index b55de20..c772481 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ -# $Id: INSTALL,v 1.15 2009/06/30 03:21:17 gilles Exp gilles $ +# $Id: INSTALL,v 1.16 2010/01/14 23:41:59 gilles Exp gilles $ # # INSTALL file for imapsync # imapsync : IMAP sync or copy tool. @@ -82,6 +82,12 @@ Here is some individual module help: - Date::Manip perl -mDate::Manip -e '' +- File::Spec + perl -mFile::Spec -e '' + +- File::Path + perl -mFile::Path -e '' + - (Option) Perl Digest::HMAC_MD5 module Good for non plain text password over network. diff --git a/Makefile b/Makefile index ccf8a36..105f4bd 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -# $Id: Makefile,v 1.25 2010/01/12 06:31:22 gilles Exp gilles $ +# $Id: Makefile,v 1.26 2010/01/15 00:01:40 gilles Exp gilles $ TARGET=imapsync @@ -126,9 +126,9 @@ clean_dist: # Local goals -.PHONY: lfo niouze +.PHONY: lfo lfo_upload niouze_lfo niouze_fm public -lfo: dist lfo_upload niouze_lfo niouze +lfo: dist lfo_upload niouze_lfo lfo_upload: rsync -avH --delete . \ @@ -140,8 +140,8 @@ lfo_upload: niouze_lfo : VERSION . memo && lfo_announce -niouze: VERSION +niouze_fm: VERSION . memo && fm_announce -public: niouze +public: niouze_fm diff --git a/README b/README index 25932ca..807a22f 100644 --- a/README +++ b/README @@ -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.293 $ + $Revision: 1.299 $ INSTALL imapsync works fine under any Unix OS with perl. @@ -161,9 +161,9 @@ EXIT STATUS done LICENSE - imapsync is free, gratis and open source software cover by the GNU - General Public License. See the GPL file included in the distribution or - the web site http://www.gnu.org/licenses/licenses.html + imapsync is free, gratis and open source software cover by the Do What + The Fuck You Want To Public License (WTFPL). See COPYING file included + in the distribution or the web site http://sam.zoy.org/wtfpl/COPYING MAILING-LIST The public mailing-list may be the best way to get support. @@ -336,7 +336,7 @@ HUGE MIGRATION Welcome in shell programming ! Hacking - Feel free to hack imapsync as the GPL Licence permits it. + Feel free to hack imapsync as the WTFPL Licence permits it. Links Entries for imapsync: http://www.imap.org/products/showall.php @@ -362,5 +362,5 @@ SIMILAR SOFTWARES Feedback (good or bad) will always be welcome. - $Id: imapsync,v 1.293 2010/01/12 05:34:27 gilles Exp gilles $ + $Id: imapsync,v 1.299 2010/01/15 00:19:32 gilles Exp gilles $ diff --git a/TODO b/TODO index 060cf1d..f598127 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: TODO,v 1.68 2010/01/12 05:28:22 gilles Exp gilles $ +# $Id: TODO,v 1.69 2010/01/14 23:41:43 gilles Exp gilles $ TODO file for imapsync ---------------------- @@ -16,7 +16,6 @@ mailboxes). May be the best is to take a part of the body. Have to code this. - Add an option to store flags with "FLAGS.SILENT" instead of "+FLAGS.SILENT". @@ -46,14 +45,11 @@ Add NOOP commands to avoid timeouts. Start a wiki for imapsync. Add a --pidfile option. -Add a --tmpfile option. -Add a --tmpdir option. + Write a clean_exit() replacing each die() or exit() call. Add a --skipheaderinfolder option See the code patches/imapsync_Cvitkovich_pidfile_tmpfile -Make --skipheader be multiple - Fix this: > - Erreur avec la traditionnelle différence entre Windows > et LInux sur les retour-chariots : le calcul de la @@ -72,9 +68,6 @@ messages, not folders." Add different levels of output to see clearly the problem by default. -Add --justlogin --justlogin1 --justlogin2 options -to check username and passwort. - Add --subscribeall option. Is it possible to have a option that subscribes all folders regardless of @@ -143,6 +136,18 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html Explain expunge behavior. + +USELESS. Make --skipheader be multiple. Useless since we can +use the or perl regex '^X-|^Date|^From' + + +USELESS. Add a --tmpfile option. + +DONE. Add --justlogin options +to check usernames and passwords. + +DONE. Add a --tmpdir option. + DONE. Fix bug "Found that if folders have a space at the end of the name, it will not create the folder name on the new server, nor will it copy that folder's email." diff --git a/VERSION b/VERSION index 5fbdab3..ea59eca 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.293 +1.299 diff --git a/freshmeat_submition.out b/freshmeat_submition.out index bb87c6d..391d5de 100644 --- a/freshmeat_submition.out +++ b/freshmeat_submition.out @@ -1,15 +1,11 @@ Project: imapsync -Version: 1.288 -Release-Focus: Major feature enhancements +Version: 1.293 +Release-Focus: Minor bugfixes Hide: N Home-Page-URL: http://www.linux-france.org/prj/imapsync/ Gzipped-Tar-URL: http://www.linux-france.org/prj/imapsync/dist/ -Enhancements: -- Support Gmail imap -- Works fine under Windows XP (tm) -- Works with Mail::IMAPClient 3.xx and 2.2.9 -- Many bug fixes +Bug fixes. Many thanks to the freshmeat folk that correct my bad and poorly English ! diff --git a/imapsync b/imapsync index c3b1686..a86cab5 100755 --- a/imapsync +++ b/imapsync @@ -9,7 +9,7 @@ tool. Synchronise mailboxes between two imap servers. Good at IMAP migration. More than 32 different IMAP server softwares supported with success. -$Revision: 1.293 $ +$Revision: 1.299 $ =head1 INSTALL @@ -189,9 +189,9 @@ in a Bourne shell: =head1 LICENSE imapsync is free, gratis and open source software cover by -the GNU General Public License. See the GPL file included in -the distribution or the web site -http://www.gnu.org/licenses/licenses.html +the Do What The Fuck You Want To Public License (WTFPL). +See COPYING file included in the distribution or the web site +http://sam.zoy.org/wtfpl/COPYING =head1 MAILING-LIST @@ -387,7 +387,7 @@ Welcome in shell programming ! =head1 Hacking -Feel free to hack imapsync as the GPL Licence permits it. +Feel free to hack imapsync as the WTFPL Licence permits it. =head1 Links @@ -418,7 +418,7 @@ Entries for imapsync: Feedback (good or bad) will always be welcome. -$Id: imapsync,v 1.293 2010/01/12 05:34:27 gilles Exp gilles $ +$Id: imapsync,v 1.299 2010/01/15 00:19:32 gilles Exp gilles $ =cut @@ -435,6 +435,8 @@ use MIME::Base64; use English; use POSIX qw(uname); use Fcntl; +use File::Spec; +use File::Path qw(mkpath rmtree); #use Test::Simple tests => 1; use Test::More 'no_plan'; @@ -479,25 +481,25 @@ my( $reconnectretry1, $reconnectretry2, $tests, $test_builder, $allow3xx, $justlogin, + $tmpdir, ); use vars qw ($opt_G); # missing code for this will be option. -$rcs = '$Id: imapsync,v 1.293 2010/01/12 05:34:27 gilles Exp gilles $ '; +$rcs = '$Id: imapsync,v 1.299 2010/01/15 00:19:32 gilles Exp gilles $ '; $rcs =~ m/,v (\d+\.\d+)/; $VERSION = ($1) ? $1: "UNKNOWN"; my $VERSION_IMAPClient = $Mail::IMAPClient::VERSION; - - $mess_size_total_trans = 0; $mess_size_total_skipped = 0; $mess_size_total_error = 0; $mess_trans = $mess_skipped = $mess_skipped_dry = 0; + sub check_lib_version { $debug and print "VERSION_IMAPClient $VERSION_IMAPClient\n"; if ($VERSION_IMAPClient eq '2.2.9') { @@ -533,6 +535,8 @@ Date::Manip $Date::Manip::VERSION } + +# Construct a command line copy with passwords replaced by MASKED. my @argv_nopassord; my @argv_copy = @ARGV; while (@argv_copy) { @@ -547,8 +551,8 @@ while (@argv_copy) { my $banner = join("", '$RCSfile: imapsync,v $ ', - '$Revision: 1.293 $ ', - '$Date: 2010/01/12 05:34:27 $ ', + '$Revision: 1.299 $ ', + '$Date: 2010/01/15 00:19:32 $ ', "\n",localhost_info(), " and the module Mail::IMAPClient version used here is ", $VERSION_IMAPClient,"\n", @@ -563,6 +567,20 @@ unless(defined(&_SYSEXITS_H)) { get_options(); +$tmpdir ||= File::Spec->tmpdir(); + + +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; @@ -572,6 +590,10 @@ check_lib_version() or print $banner; +print "Temp directory is $tmpdir\n"; + +check_dir($tmpdir); + exit(0) if ($justbanner); @@ -1278,8 +1300,6 @@ sub tests_flags_regex { @regexflag = ('s/(\s|^)[^\\\\]\w+//g'); ok('\Seen \Middle \End' eq flags_regex('\Seen NonJunk \Middle $Spam \End'), 'flags_regex, only \word [' . flags_regex('\Seen NonJunk \Middle $Spam \End'.']')); ok(' \Seen \Middle \End1' eq flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'), 'flags_regex, only \word [' . flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'.']')); - - } sub flags_regex { @@ -1315,6 +1335,62 @@ sub acls_sync { } +sub tests_permanentflags { + + my $string; + ok('' eq permanentflags(' * OK [PERMANENTFLAGS (\* \Draft \Answered)] Limited'), + 'permanentflags \*'); + ok('\Draft \Answered' eq permanentflags(' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited'), + 'permanentflags \Draft \Answered'); + ok('\Draft \Answered' + eq permanentflags('Blabla', + ' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited', + 'Blabla'), + 'permanentflags \Draft \Answered' + ); + ok('' eq permanentflags('Blabla'), 'permanentflags nothing'); +} + +sub permanentflags { + my @lines = @_; + + foreach my $line (@lines) { + if ($line =~ m{\[PERMANENTFLAGS \(([^)]+?)\)\]}) { + #print "%%%$1%%%\n"; + my $permanentflags = $1; + if ($permanentflags =~ m{\\\*}) { + $permanentflags = ''; + } + return($permanentflags); + }; + } +} + +sub tests_flags_filter { + + ok( '\Seen' eq flags_filter('\Seen', '\Draft \Seen \Answered'), 'flags_filter ' ); + ok( '' eq flags_filter('\Seen', '\Draft \Answered'), 'flags_filter ' ); + ok( '\Seen' eq flags_filter('\Seen', '\Seen'), 'flags_filter ' ); + ok( '\Seen' eq flags_filter('\Seen', ' \Seen '), 'flags_filter ' ); + ok( '\Seen \Draft' + eq flags_filter('\Seen \Draft', '\Draft \Seen \Answered'), 'flags_filter ' ); + ok( '\Seen \Draft' + eq flags_filter('\Seen \Draft', ' \Draft \Seen \Answered '), 'flags_filter ' ); + +} + +sub flags_filter { + my($flags, $allowed_flags) = @_; + + my @flags = split(/\s+/, $flags); + my %allowed_flags = map { $_ => 1 } split(' ', $allowed_flags ); + my @flags_out = map { exists $allowed_flags{$_} ? $_ : () } @flags; + + my $flags_out = join(' ', @flags_out); + #print "%%%$flags_out%%%\n"; + return($flags_out); +} + print "++++ Looping on each folder ++++\n"; FOLDER: foreach my $f_fold (@f_folders) { @@ -1333,6 +1409,7 @@ FOLDER: foreach my $f_fold (@f_folders) { $error++; next FOLDER; } + if ( ! exists($t_folders_list{$t_fold})) { print "To Folder $t_fold does not exist\n"; print "Creating folder [$t_fold]\n"; @@ -1358,10 +1435,15 @@ FOLDER: foreach my $f_fold (@f_folders) { $error++; next FOLDER; } + my @select_results = $to->Results(); + + #print "%%% @select_results\n"; + my $permanentflags2 = permanentflags(@select_results); if ($expunge){ - print "Expunging $f_fold and $t_fold\n"; + print "Expunging host1 $f_fold\n"; unless($dry) { $from->expunge() }; + #print "Expunging host2 $t_fold\n"; #unless($dry) { $to->expunge() }; } @@ -1389,6 +1471,8 @@ FOLDER: foreach my $f_fold (@f_folders) { my %f_hash = (); my %t_hash = (); + #print "++++ Using cache ++++\n"; + print "++++ From [$f_fold] Parse 1 ++++\n"; last FOLDER if $from->IsUnconnected(); last FOLDER if $to->IsUnconnected(); @@ -1533,6 +1617,8 @@ FOLDER: foreach my $f_fold (@f_folders) { #string_to_file($string, $message_file); } + + sub tests_regexmess { ok("blabla" eq regexmess("blabla"), "regexmess, nothing to do"); @@ -1589,6 +1675,8 @@ FOLDER: foreach my $f_fold (@f_folders) { $flags_f =~ s@\\Recent\s?@@gi; $flags_f = flags_regex($flags_f) if @regexflag; + $flags_f = flags_filter($flags_f, $permanentflags2) if ($permanentflags2); + my $new_id; print "flags from: [$flags_f][$d]\n"; last FOLDER if $from->IsUnconnected(); @@ -1655,7 +1743,7 @@ FOLDER: foreach my $f_fold (@f_folders) { # RFC 2060: This flag can not be altered by any client $flags_f =~ s@\\Recent\s?@@gi; $flags_f = flags_regex($flags_f) if @regexflag; - + $flags_f = flags_filter($flags_f, $permanentflags2) if ($permanentflags2); # compare flags - add missing flags my @ff = split(' ', $flags_f ); my %ft = map { $_ => 1 } split(' ', $flags_t ); @@ -1829,7 +1917,7 @@ sub stats { sub thank_author { - return(join("", "Happy with this free, open and gratis GPL software?\n", + return(join("", "Happy with this free, open and gratis WTFPL software?\n", "Encourage the author (Gilles LAMIRAL) by giving him a book:\n", "http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/\n", "or via paypal:\n", @@ -1915,7 +2003,8 @@ sub get_options { "reconnectretry2=i" => \$reconnectretry2, "tests" => \$tests, "allow3xx!" => \$allow3xx, - "justlogin!" => \$justlogin, + "justlogin!" => \$justlogin, + "tmpdir=s" => \$tmpdir, ); $debug and print "get options: [$opt_ret]\n"; @@ -2094,6 +2183,9 @@ Several options are mandatory. Several folders to avoid: --exclude 'fold1|fold2|f3' skips fold1, fold2 and f3. --exclude : or this one, etc. +--tmpdir : where to store temporary files and subdirectories. + Will be created if it doesn't exist. + Default is system specific and should be ok. --prefix1 : remove prefix to all destination folders (usually INBOX. for cyrus imap servers) you can use --prefix1 if your source imap server @@ -2170,14 +2262,15 @@ Several options are mandatory. --syncacls : Synchronises acls (Access Control Lists). --nosyncacls : Does not synchronise acls. This is the default. --debug : debug mode. ---debugimap : imap debug mode. +--debugimap : imap debug mode. Very verbose. --version : print software version. --justconnect : just connect to both servers and print useful information. Need only --host1 and --host2 options. --justlogin : just login to both servers with users credentials and exit. --justfolders : just do things about folders (ignore messages). ---fast : be faster (just does not sync flags). +--fast : be faster (just does not sync flags with files + already transfered). --reconnectretry1 : reconnect if connection is lost up to times --reconnectretry2 : reconnect if connection is lost up to times --split1 : split the requests in several parts on source server. @@ -2215,6 +2308,8 @@ sub tests { tests_compare_lists(); tests_regexmess(); tests_flags_regex(); + tests_permanentflags(); + tests_flags_filter(); } } diff --git a/learn/file_spec b/learn/file_spec new file mode 100755 index 0000000..b169b13 --- /dev/null +++ b/learn/file_spec @@ -0,0 +1,14 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use File::Spec; + + +my $tmpdir = File::Spec->tmpdir(); +print "$tmpdir\n"; + + +my $cachedir = File::Spec->catdir($tmpdir, 'host1', 'user1', 'host2', 'user2'); +print "$cachedir\n"; diff --git a/tests.sh b/tests.sh index a6ce57c..69d25f4 100644 --- a/tests.sh +++ b/tests.sh @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: tests.sh,v 1.95 2010/01/12 04:09:57 gilles Exp gilles $ +# $Id: tests.sh,v 1.96 2010/01/14 23:40:54 gilles Exp gilles $ # Example: # CMD_PERL='perl -I./Mail-IMAPClient-3.14/lib' sh -x tests.sh @@ -454,8 +454,8 @@ ll_skipheader() --passfile1 ../../var/pass/secret.tata \ --host2 $HOST2 --user2 titi \ --passfile2 ../../var/pass/secret.titi \ - --skipheader 'X-.*' --folder INBOX.yop.yap \ - --allow3xx + --skipheader '^X-.*|^Date' --folder INBOX.yop.yap \ + --allow3xx --debug }