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

benjamin.peterson python-checkins at python.org
Tue Jan 24 15:07:23 CET 2012


http://hg.python.org/cpython/rev/38c066ca4966
changeset:   74593:38c066ca4966
parent:      74592:d90f943b0c92
parent:      74590:a7406565ef1c
user:        Benjamin Peterson <benjamin at python.org>
date:        Tue Jan 24 09:06:45 2012 -0500
summary:
  merge heads

files:
  Doc/library/functools.rst  |   2 +-
  Doc/library/os.rst         |   9 ++-----
  Doc/library/stdtypes.rst   |   2 +-
  Doc/library/time.rst       |  27 +++++++++++++------------
  Lib/test/test_os.py        |   9 ++++++-
  Lib/test/test_time.py      |   2 +-
  Misc/NEWS                  |   4 +++
  Modules/posixmodule.c      |  11 ----------
  Python/formatter_unicode.c |  10 ++++----
  9 files changed, 36 insertions(+), 40 deletions(-)


diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst
--- a/Doc/library/functools.rst
+++ b/Doc/library/functools.rst
@@ -20,7 +20,7 @@
 
 .. function:: cmp_to_key(func)
 
-   Transform an old-style comparison function to a key-function.  Used with
+   Transform an old-style comparison function to a key function.  Used with
    tools that accept key functions (such as :func:`sorted`, :func:`min`,
    :func:`max`, :func:`heapq.nlargest`, :func:`heapq.nsmallest`,
    :func:`itertools.groupby`).  This function is primarily used as a transition
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -2085,11 +2085,9 @@
    *target_is_directory*, which defaults to ``False``.
 
    On Windows, a symlink represents a file or a directory, and does not morph to
-   the target dynamically.  For this reason, when creating a symlink on Windows,
-   if the target is not already present, the symlink will default to being a
-   file symlink.  If *target_is_directory* is set to ``True``, the symlink will
-   be created as a directory symlink.  This parameter is ignored if the target
-   exists (and the symlink is created with the same type as the target).
+   the target dynamically.  If *target_is_directory* is set to ``True``, the
+   symlink will be created as a directory symlink, otherwise as a file symlink
+   (the default).
 
    Symbolic link support was introduced in Windows 6.0 (Vista).  :func:`symlink`
    will raise a :exc:`NotImplementedError` on Windows versions earlier than 6.0.
@@ -2102,7 +2100,6 @@
       administrator level. Either obtaining the privilege or running your
       application as an administrator are ways to successfully create symlinks.
 
-
       :exc:`OSError` is raised when the function is called by an unprivileged
       user.
 
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -877,7 +877,7 @@
 | ``s * n, n * s`` | *n* shallow copies of *s*      | \(2)     |
 |                  | concatenated                   |          |
 +------------------+--------------------------------+----------+
-| ``s[i]``         | *i*'th item of *s*, origin 0   | \(3)     |
+| ``s[i]``         | *i*\ th item of *s*, origin 0  | \(3)     |
 +------------------+--------------------------------+----------+
 | ``s[i:j]``       | slice of *s* from *i* to *j*   | (3)(4)   |
 +------------------+--------------------------------+----------+
diff --git a/Doc/library/time.rst b/Doc/library/time.rst
--- a/Doc/library/time.rst
+++ b/Doc/library/time.rst
@@ -183,19 +183,6 @@
 
    .. versionadded:: 3.3
 
-.. function:: wallclock()
-
-   .. index::
-      single: Wallclock
-      single: benchmarking
-
-   Return the current time in fractions of a second to the system's best ability.
-   Use this when the most accurate representation of wall-clock is required, i.e.
-   when "processor time" is inappropriate.  The reference point of the returned
-   value is undefined so only the difference of consecutive calls is valid.
-
-   .. versionadded: 3.3
-
 .. function:: ctime([secs])
 
    Convert a time expressed in seconds since the epoch to a string representing
@@ -550,6 +537,20 @@
       ('EET', 'EEST')
 
 
+.. function:: wallclock()
+
+   .. index::
+      single: Wallclock
+      single: benchmarking
+
+   Return the current time in fractions of a second to the system's best ability.
+   Use this when the most accurate representation of wall-clock is required, i.e.
+   when "processor time" is inappropriate.  The reference point of the returned
+   value is undefined so only the difference of consecutive calls is valid.
+
+   .. versionadded: 3.3
+
+
 .. seealso::
 
    Module :mod:`datetime`
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -500,7 +500,12 @@
             f.write("I'm " + path + " and proud of it.  Blame test_os.\n")
             f.close()
         if support.can_symlink():
-            os.symlink(os.path.abspath(t2_path), link_path)
+            if os.name == 'nt':
+                def symlink_to_dir(src, dest):
+                    os.symlink(src, dest, True)
+            else:
+                symlink_to_dir = os.symlink
+            symlink_to_dir(os.path.abspath(t2_path), link_path)
             sub2_tree = (sub2_path, ["link"], ["tmp3"])
         else:
             sub2_tree = (sub2_path, [], ["tmp3"])
@@ -1131,7 +1136,7 @@
             os.remove(self.missing_link)
 
     def test_directory_link(self):
-        os.symlink(self.dirlink_target, self.dirlink)
+        os.symlink(self.dirlink_target, self.dirlink, True)
         self.assertTrue(os.path.exists(self.dirlink))
         self.assertTrue(os.path.isdir(self.dirlink))
         self.assertTrue(os.path.islink(self.dirlink))
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -334,7 +334,7 @@
     def test_wallclock(self):
         t1 = time.wallclock()
         t2 = time.wallclock()
-        self.assertGreater(t2, t1)
+        self.assertGreaterEqual(t2, t1)
 
         t1 = time.wallclock()
         time.sleep(0.1)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -458,6 +458,10 @@
 Library
 -------
 
+- Issue #13772: In os.symlink() under Windows, do not try to guess the link
+  target's type (file or directory).  The detection was buggy and made the
+  call non-atomic (therefore prone to race conditions).
+
 - Issue #6631: Disallow relative file paths in urllib urlopen methods.
 
 - Issue #13722: Avoid silencing ImportErrors when initializing the codecs
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -6551,7 +6551,6 @@
     wchar_t *wsrc, *wdest;
     int target_is_directory = 0;
     DWORD res;
-    WIN32_FILE_ATTRIBUTE_DATA src_info;
 
     if (!check_CreateSymbolicLinkW())
     {
@@ -6581,16 +6580,6 @@
     if (wsrc == NULL)
         goto error;
 
-    /* if src is a directory, ensure target_is_directory==1 */
-    if(
-        GetFileAttributesExW(
-            wsrc, GetFileExInfoStandard, &src_info
-        ))
-    {
-        target_is_directory = target_is_directory ||
-            (src_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
-    }
-
     Py_BEGIN_ALLOW_THREADS
     res = Py_CreateSymbolicLinkW(wdest, wsrc, target_is_directory);
     Py_END_ALLOW_THREADS
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
--- a/Python/formatter_unicode.c
+++ b/Python/formatter_unicode.c
@@ -682,7 +682,7 @@
     Py_ssize_t pos;
     Py_ssize_t len = PyUnicode_GET_LENGTH(value);
     PyObject *result = NULL;
-    int maxchar = 127;
+    Py_UCS4 maxchar = 127;
 
     /* sign is not allowed on strings */
     if (format->sign != '\0') {
@@ -749,7 +749,7 @@
                             IntOrLongToString tostring)
 {
     PyObject *result = NULL;
-    int maxchar = 127;
+    Py_UCS4 maxchar = 127;
     PyObject *tmp = NULL;
     Py_ssize_t inumeric_chars;
     Py_UCS4 sign_char = '\0';
@@ -798,7 +798,7 @@
         tmp = PyUnicode_FromOrdinal(x);
         inumeric_chars = 0;
         n_digits = 1;
-        maxchar = Py_MAX(maxchar, x);
+        maxchar = Py_MAX(maxchar, (Py_UCS4)x);
 
         /* As a sort-of hack, we tell calc_number_widths that we only
            have "remainder" characters. calc_number_widths thinks
@@ -926,7 +926,7 @@
     NumberFieldWidths spec;
     int flags = 0;
     PyObject *result = NULL;
-    int maxchar = 127;
+    Py_UCS4 maxchar = 127;
     Py_UCS4 sign_char = '\0';
     int float_type; /* Used to see if we have a nan, inf, or regular float. */
     PyObject *unicode_tmp = NULL;
@@ -1070,7 +1070,7 @@
     NumberFieldWidths im_spec;
     int flags = 0;
     PyObject *result = NULL;
-    int maxchar = 127;
+    Py_UCS4 maxchar = 127;
     int rkind;
     void *rdata;
     Py_ssize_t index;

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


More information about the Python-checkins mailing list