[Python-checkins] cpython (merge default -> default): merge

alexander.belopolsky python-checkins at python.org
Sun Apr 29 22:42:10 CEST 2012


http://hg.python.org/cpython/rev/e14ed98fc33c
changeset:   76646:e14ed98fc33c
parent:      76643:399cb1afb747
parent:      76645:6e029b6c142a
user:        Alexander Belopolsky <alexander.belopolsky at gmail.com>
date:        Sun Apr 29 16:34:43 2012 -0400
summary:
  merge

files:
  Lib/imaplib.py           |  16 ++-----------
  Lib/test/support.py      |  31 +++++++++++++++++++++++++++-
  Lib/test/test_imaplib.py |   9 +++++++-
  Misc/ACKS                |   1 +
  Misc/NEWS                |   3 ++
  5 files changed, 45 insertions(+), 15 deletions(-)


diff --git a/Lib/imaplib.py b/Lib/imaplib.py
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -22,7 +22,7 @@
 
 __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
@@ -1347,19 +1347,9 @@
         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)
 
 
 
diff --git a/Lib/test/support.py b/Lib/test/support.py
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -57,7 +57,7 @@
     "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754",
     "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
     "import_fresh_module", "requires_zlib", "PIPE_MAX_SIZE", "failfast",
-    "anticipate_failure"
+    "anticipate_failure", "run_with_tz"
     ]
 
 class Error(Exception):
@@ -1100,6 +1100,35 @@
     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.
 
diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
--- a/Lib/test/test_imaplib.py
+++ b/Lib/test/test_imaplib.py
@@ -11,7 +11,7 @@
 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 @@
             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
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -770,6 +770,7 @@
 Dan Parisien
 Harri Pasanen
 Gaël Pasgrimaud
+Joe Peterson
 Randy Pausch
 Samuele Pedroni
 Marcel van der Peijl
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -84,6 +84,9 @@
 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 #6085: In http.server.py SimpleHTTPServer.address_string returns the

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list