]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Sun, 29 Apr 2012 19:56:49 +0000 (15:56 -0400)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Sun, 29 Apr 2012 19:56:49 +0000 (15:56 -0400)
the DST transition.  Patch by Joe Peterson.

Lib/imaplib.py
Lib/test/support.py
Lib/test/test_imaplib.py
Misc/ACKS
Misc/NEWS

index 1fcba21176dca2ee9ab30458d492e3f72a1c8328..c0334d88c3df0bdf9c919cd68d40f700925cba60 100644 (file)
@@ -22,7 +22,7 @@ Public functions:       Internaldate2tuple
 
 __version__ = "2.58"
 
-import binascii, errno, random, re, socket, subprocess, sys, time
+import binascii, errno, random, re, socket, subprocess, sys, time, calendar
 
 try:
     import ssl
@@ -1340,19 +1340,9 @@ def Internaldate2tuple(resp):
         zone = -zone
 
     tt = (year, mon, day, hour, min, sec, -1, -1, -1)
+    utc = calendar.timegm(tt) - zone
 
-    utc = time.mktime(tt)
-
-    # Following is necessary because the time module has no 'mkgmtime'.
-    # 'mktime' assumes arg in local timezone, so adds timezone/altzone.
-
-    lt = time.localtime(utc)
-    if time.daylight and lt[-1]:
-        zone = zone + time.altzone
-    else:
-        zone = zone + time.timezone
-
-    return time.localtime(utc - zone)
+    return time.localtime(utc)
 
 
 
index 01cd2034064e7ee6cd48be1fc1cbdd690c63baa3..0526b14fdbdf77f54cb7f8eba6866e2d0448c4c9 100644 (file)
@@ -53,7 +53,7 @@ __all__ = [
     "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
     "swap_item", "swap_attr", "requires_IEEE_754",
     "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
-    "import_fresh_module", "failfast",
+    "import_fresh_module", "failfast", "run_with_tz"
     ]
 
 class Error(Exception):
@@ -1020,6 +1020,35 @@ def run_with_locale(catstr, *locales):
         return inner
     return decorator
 
+#=======================================================================
+# Decorator for running a function in a specific timezone, correctly
+# resetting it afterwards.
+
+def run_with_tz(tz):
+    def decorator(func):
+        def inner(*args, **kwds):
+            if 'TZ' in os.environ:
+                orig_tz = os.environ['TZ']
+            else:
+                orig_tz = None
+            os.environ['TZ'] = tz
+            time.tzset()
+
+            # now run the function, resetting the tz on exceptions
+            try:
+                return func(*args, **kwds)
+            finally:
+                if orig_tz == None:
+                    del os.environ['TZ']
+                else:
+                    os.environ['TZ'] = orig_tz
+                time.tzset()
+
+        inner.__name__ = func.__name__
+        inner.__doc__ = func.__doc__
+        return inner
+    return decorator
+
 #=======================================================================
 # Big-memory-test support. Separate from 'resources' because memory use
 # should be configurable.
index 80340004d79f70d188f745a887a9864146c1c061..7e9329cc4cc1e8d1192b007b53cc48171f483e00 100644 (file)
@@ -11,7 +11,7 @@ import socketserver
 import time
 import calendar
 
-from test.support import reap_threads, verbose, transient_internet
+from test.support import reap_threads, verbose, transient_internet, run_with_tz
 import unittest
 
 try:
@@ -36,6 +36,13 @@ class TestImaplib(unittest.TestCase):
             b'25 (INTERNALDATE "31-Dec-1999 12:30:00 -1130")')
         self.assertEqual(time.mktime(tt), t0)
 
+    @run_with_tz('MST+07MDT,M4.1.0,M10.5.0')
+    def test_Internaldate2tuple_issue10941(self):
+        self.assertNotEqual(imaplib.Internaldate2tuple(
+            b'25 (INTERNALDATE "02-Apr-2000 02:30:00 +0000")'),
+                            imaplib.Internaldate2tuple(
+            b'25 (INTERNALDATE "02-Apr-2000 03:30:00 +0000")'))
+
     def test_that_Time2Internaldate_returns_a_result(self):
         # We can check only that it successfully produces a result,
         # not the correctness of the result itself, since the result
index 079386e356c16acc0a47efe661f6d8f415d0c236..7373bc91a51d2405ff986b308be8617fdbc2fe07 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -702,6 +702,7 @@ Peter Parente
 Alexandre Parenteau
 Dan Parisien
 Harri Pasanen
+Joe Peterson
 Randy Pausch
 Samuele Pedroni
 Marcel van der Peijl
index ebf0cfacaed3eb864b639ff6e96ec220e03d3f9c..412735bb07dccfbdc3d57694c9b4abb5c45631f9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -56,6 +56,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
+  the DST transition.  Patch by Joe Peterson.
+
 - Issue #9154: Fix parser module to understand function annotations.
 
 - Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a