Переглянути джерело

Add code patches that were present in isync-0.9.1-3 via the dpatch
mechanism.

Theodore Ts'o 21 роки тому
батько
коміт
016d6d64e6

+ 2 - 2
debian/changelog

@@ -1,8 +1,8 @@
 isync (0.9.2-1) unstable; urgency=low
 
-  * New upstream release
+  * New upstream release.
 
- -- Oswald Buddenhagen <ossi@users.sf.net>  Sun, 07 Dec 2003 16:13:00 +0100
+ -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 11 Jan 2004 01:47:11 -0500
 
 isync (0.9.1-3) unstable; urgency=low
 

+ 1 - 1
debian/control

@@ -3,7 +3,7 @@ Section: mail
 Priority: optional
 Maintainer: Nicolas Boullis <nboullis@debian.org>
 Standards-Version: 3.6.1
-Build-Depends: libssl-dev, debhelper (>= 4.1.16), dpkg-dev (>= 1.9.0), libdb4.0-dev
+Build-Depends: libssl-dev, debhelper (>= 4.1.16), dpkg-dev (>= 1.9.0), libdb4.0-dev, dpatch
 
 Package: isync
 Architecture: any

+ 3 - 0
debian/patches/00list

@@ -0,0 +1,3 @@
+10-size-opt.dpatch
+20-cleanup.dpatch
+

+ 81 - 0
debian/patches/10-size-opt.dpatch

@@ -0,0 +1,81 @@
+#! /bin/sh -e
+## 10-size-opt.dpatch by Nicolas Boullis <nboullis@debian.org> 
+##
+## DP: This patch from Nicolas Boullis <nboullis@debian.org> optimizes isync
+## DP: by not fetching the sizes of messages if they are unneeded (i.e., if
+## DP: MaxSize is not specified in the config file).
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+	*)
+		echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+		exit 1;;
+esac
+
+exit 0
+@DPATCH@
+
+===================================================================
+RCS file: isync-0.9.2/src/RCS/isync.h,v
+retrieving revision 1.1
+diff -u -r1.1 isync-0.9.2/src/isync.h
+--- isync-0.9.2/src/isync.h	2004/01/09 23:06:52	1.1
++++ isync-0.9.2/src/isync.h	2004/01/09 23:07:08
+@@ -205,7 +205,7 @@
+ int imap_set_flags (imap_t *, unsigned int, unsigned int);
+ int imap_expunge (imap_t *);
+ imap_t *imap_connect (config_t *);
+-imap_t *imap_open (config_t *, unsigned int, imap_t *, int);
++imap_t *imap_open (config_t *, unsigned int, imap_t *, int, int);
+ int imap_append_message (imap_t *, int, message_t *);
+ int imap_list (imap_t *);
+ 
+===================================================================
+RCS file: isync-0.9.2/src/RCS/imap.c,v
+retrieving revision 1.1
+diff -u -r1.1 isync-0.9.2/src/imap.c
+--- isync-0.9.2/src/imap.c	2004/01/09 23:08:20	1.1
++++ isync-0.9.2/src/imap.c	2004/01/09 23:09:54
+@@ -874,7 +874,8 @@
+  * mailbox.
+  */
+ imap_t *
+-imap_open (config_t * box, unsigned int minuid, imap_t * imap, int imap_create)
++imap_open (config_t * box, unsigned int minuid, imap_t * imap, 
++	   int imap_create, int get_size)
+ {
+   if (imap)
+   {
+@@ -940,7 +941,8 @@
+     imap->minuid = minuid;
+     if (imap->count > 0)
+     {
+-      if (imap_exec (imap, "UID FETCH %d:* (FLAGS RFC822.SIZE)", minuid))
++      if (imap_exec (imap, "UID FETCH %d:* (FLAGS%s)", minuid, 
++		     get_size ? " RFC822.SIZE" : ""))
+ 	goto bail;
+     }
+ 
+===================================================================
+RCS file: isync-0.9.2/src/RCS/main.c,v
+retrieving revision 1.1
+diff -u -r1.1 isync-0.9.2/src/main.c
+--- isync-0.9.2/src/main.c	2004/01/09 23:08:20	1.1
++++ isync-0.9.2/src/main.c	2004/01/09 23:08:31
+@@ -396,7 +396,7 @@
+ 		break;
+ 	    }
+ 
+-	    imap = imap_open (box, fast ? mail->maxuid + 1 : 1, imap, imap_create);
++	    imap = imap_open (box, fast ? mail->maxuid + 1 : 1, imap, imap_create, box->max_size!=0);
+ 	    if (!imap)
+ 	    {
+ 		fprintf (stderr, "%s: skipping mailbox due to IMAP error\n",

+ 146 - 0
debian/patches/20-cleanup.dpatch

@@ -0,0 +1,146 @@
+#! /bin/sh -e
+## 20-cleanup.dpatch by Theodore Ts'o <tytso@mit.edu>
+##
+## DP: Make sure the database store and the imap database is closed
+## DP: if isync is aborted.
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+	*)
+		echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+		exit 1;;
+esac
+
+exit 0
+@DPATCH@
+
+Problem description:
+
+>> If isync dies in the middle of synchronization, or the network
+>> connection breaks while it is synchronizing a mailbox, new messages
+>> which are downloaded from the IMAP server do not have their UID saved
+>> to the maildir directory.  This is REALLY, REALLY BAD, because it
+>> means that on the next isync, the downloaded messages are re-uploaded
+>> to the imap server, resulting in duplicate messages in the IMAP store.
+>> 
+>> This takes means the network download takes longer, and if the network
+>> connection is unrealible, it means it's more likely the the IMAP
+>> connection will break, resulting in more duplicate messages being
+>> uploaded to the servers.  (The first time, 14 messages were uploaded
+>> to the server.  The second time I re-isynced, 65 messages were
+>> uploaded to the server, resulting in some 79 duplicate messages that I
+>> had to manually weed out.  Grr, grr, grr, grr.)
+
+Problem solution:
+
+Actually, I managed to figure out the solution a while ago, and got
+hung up trying to figure out the right way to submit the patches back
+to upstream (there's no mailing list that I can find; so do you just
+communicate directly with the developers).  Anyway, I got busy and I
+never had a chance to send the patches a while ago.
+
+This patch is not the best, but it does seem to work.  Perhaps a
+better approach would be to use the more advanced API's available with
+berkdb, so you can actually force a sync to the db/dbm files after
+the mail message has been downloaded.  Fundamentally, that's the
+problem.  The id has been added to the db file, but the changes don't
+get forced out to disk, so in the case of an abnormal termination of
+the program, the id's never get written to disk. 
+
+The patch enclosed below solves the problem by establishing a signal
+handler, which cleans up in the case of the user typing ^C (after the
+network connection has gone away, say because your GSM phone's GPRS
+connection has gotten flakey, for example).  However, it doesn't solve
+the problem in case of an abrupt system crash.  In order to address
+that problem, the overall program interfaces would have to be changed
+to use the newer berkdb interfaces directly, but that would mean
+dropping compatibility with the ancient dbm interface.  Personally, I
+don't think that to be any great loss, but the changes would be much
+more invasive, and would require agreement with the upstream
+maintainer that this is the right way to go.
+
+Also, for bonus points, perhaps there should be an inactivity timer so
+that isync can automatically figure out when the network connection
+has gone away, and can do a clean shutdown and exit automatically,
+instead of requiring the user to type ^C.  
+
+						- Ted
+
+
+Patched files: src/main.c
+===================================================================
+RCS file: isync-0.9.2/src/RCS/main.c,v
+retrieving revision 1.3
+diff -u -r1.3 isync-0.9.2/src/main.c
+--- isync-0.9.2/src/main.c	2004/01/10 01:13:38	1.3
++++ isync-0.9.2/src/main.c	2004/01/10 01:14:34
+@@ -35,6 +35,7 @@
+ #include <string.h>
+ #include <ctype.h>
+ #include <dirent.h>
++#include <signal.h>
+ 
+ int Quiet;
+ 
+@@ -92,6 +93,22 @@
+ unsigned int Tag = 0;
+ char Hostname[256];
+ int Verbose = 0;
++mailbox_t *CleanupMail = 0;
++imap_t *CleanupImap = 0;
++int CleanupValid = 0;
++
++static void signal_exit(int sig)
++{
++	info("Abort received\n");
++	if (CleanupValid) {
++	    info("Aborting, cleaning up\n");
++	    if (CleanupMail) 
++		    maildir_close (CleanupMail);
++	    if (CleanupImap)
++		    imap_close (CleanupImap);
++	}
++	exit (1);
++}
+ 
+ static void
+ version (void)
+@@ -319,6 +336,10 @@
+ 	usage (1);
+     }
+ 
++    signal(SIGTERM, signal_exit);
++    signal(SIGHUP, signal_exit);
++    signal(SIGINT, signal_exit);
++
+     gethostname (Hostname, sizeof (Hostname));
+ 
+     load_config (config, &o2o);
+@@ -410,6 +431,9 @@
+ 		ret = 1;
+ 		break;
+ 	    }
++	    CleanupValid = 1;
++	    CleanupMail = mail;
++	    CleanupImap = imap;
+ 
+ 	    info ("Synchronizing\n");
+ 	    i = (delete || box->delete) ? SYNC_DELETE : 0;
+@@ -460,6 +484,8 @@
+ 
+ 	} while (0);
+ 
++	CleanupValid = 0;
++
+ 	/* we never sync the same mailbox twice, so close it now */
+ 	if (mail)
+ 	    maildir_close (mail);
+

+ 8 - 3
debian/rules

@@ -1,5 +1,7 @@
 #!/usr/bin/make -f
 
+PACKAGE=isync
+
 CFLAGS = -Wall -g
 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
 CFLAGS += -O0
@@ -8,13 +10,14 @@ CFLAGS += -O2
 endif
 
 build: build-stamp
-build-stamp:
+build-stamp: patch-stamp
 	dh_testdir
 	./configure --prefix=/usr --mandir=/usr/share/man
 	$(MAKE) CFLAGS="$(CFLAGS)"
 	touch build-stamp
 
-clean:
+clean: clean1 unpatch
+clean1:
 	dh_testdir
 	dh_testroot
 	rm -f build-stamp
@@ -48,4 +51,6 @@ binary-arch: build install
 	dh_builddeb
 
 binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install
+.PHONY: build clean binary-indep binary-arch binary install clean1
+
+include /usr/share/dpatch/dpatch.make