Commit c65da4c5 authored by Benjamin Peterson's avatar Benjamin Peterson

merge heads

parents 5d4cbf9b e99b627c
...@@ -20,7 +20,7 @@ The :mod:`functools` module defines the following functions: ...@@ -20,7 +20,7 @@ The :mod:`functools` module defines the following functions:
.. function:: cmp_to_key(func) .. 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`, tools that accept key functions (such as :func:`sorted`, :func:`min`,
:func:`max`, :func:`heapq.nlargest`, :func:`heapq.nsmallest`, :func:`max`, :func:`heapq.nlargest`, :func:`heapq.nsmallest`,
:func:`itertools.groupby`). This function is primarily used as a transition :func:`itertools.groupby`). This function is primarily used as a transition
......
...@@ -2085,11 +2085,9 @@ Files and Directories ...@@ -2085,11 +2085,9 @@ Files and Directories
*target_is_directory*, which defaults to ``False``. *target_is_directory*, which defaults to ``False``.
On Windows, a symlink represents a file or a directory, and does not morph to 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, the target dynamically. If *target_is_directory* is set to ``True``, the
if the target is not already present, the symlink will default to being a symlink will be created as a directory symlink, otherwise as a file symlink
file symlink. If *target_is_directory* is set to ``True``, the symlink will (the default).
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).
Symbolic link support was introduced in Windows 6.0 (Vista). :func:`symlink` Symbolic link support was introduced in Windows 6.0 (Vista). :func:`symlink`
will raise a :exc:`NotImplementedError` on Windows versions earlier than 6.0. will raise a :exc:`NotImplementedError` on Windows versions earlier than 6.0.
...@@ -2102,7 +2100,6 @@ Files and Directories ...@@ -2102,7 +2100,6 @@ Files and Directories
administrator level. Either obtaining the privilege or running your administrator level. Either obtaining the privilege or running your
application as an administrator are ways to successfully create symlinks. application as an administrator are ways to successfully create symlinks.
:exc:`OSError` is raised when the function is called by an unprivileged :exc:`OSError` is raised when the function is called by an unprivileged
user. user.
......
...@@ -877,7 +877,7 @@ are sequences of the same type; *n*, *i*, *j* and *k* are integers. ...@@ -877,7 +877,7 @@ are sequences of the same type; *n*, *i*, *j* and *k* are integers.
| ``s * n, n * s`` | *n* shallow copies of *s* | \(2) | | ``s * n, n * s`` | *n* shallow copies of *s* | \(2) |
| | concatenated | | | | 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) | | ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |
+------------------+--------------------------------+----------+ +------------------+--------------------------------+----------+
......
...@@ -183,19 +183,6 @@ The module defines the following functions and data items: ...@@ -183,19 +183,6 @@ The module defines the following functions and data items:
.. versionadded:: 3.3 .. 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]) .. function:: ctime([secs])
Convert a time expressed in seconds since the epoch to a string representing Convert a time expressed in seconds since the epoch to a string representing
...@@ -550,6 +537,20 @@ The module defines the following functions and data items: ...@@ -550,6 +537,20 @@ The module defines the following functions and data items:
('EET', 'EEST') ('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:: .. seealso::
Module :mod:`datetime` Module :mod:`datetime`
......
...@@ -500,7 +500,12 @@ class WalkTests(unittest.TestCase): ...@@ -500,7 +500,12 @@ class WalkTests(unittest.TestCase):
f.write("I'm " + path + " and proud of it. Blame test_os.\n") f.write("I'm " + path + " and proud of it. Blame test_os.\n")
f.close() f.close()
if support.can_symlink(): 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"]) sub2_tree = (sub2_path, ["link"], ["tmp3"])
else: else:
sub2_tree = (sub2_path, [], ["tmp3"]) sub2_tree = (sub2_path, [], ["tmp3"])
...@@ -1131,7 +1136,7 @@ class Win32SymlinkTests(unittest.TestCase): ...@@ -1131,7 +1136,7 @@ class Win32SymlinkTests(unittest.TestCase):
os.remove(self.missing_link) os.remove(self.missing_link)
def test_directory_link(self): 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.exists(self.dirlink))
self.assertTrue(os.path.isdir(self.dirlink)) self.assertTrue(os.path.isdir(self.dirlink))
self.assertTrue(os.path.islink(self.dirlink)) self.assertTrue(os.path.islink(self.dirlink))
......
...@@ -334,7 +334,7 @@ class TimeTestCase(unittest.TestCase): ...@@ -334,7 +334,7 @@ class TimeTestCase(unittest.TestCase):
def test_wallclock(self): def test_wallclock(self):
t1 = time.wallclock() t1 = time.wallclock()
t2 = time.wallclock() t2 = time.wallclock()
self.assertGreater(t2, t1) self.assertGreaterEqual(t2, t1)
t1 = time.wallclock() t1 = time.wallclock()
time.sleep(0.1) time.sleep(0.1)
......
...@@ -458,6 +458,10 @@ Core and Builtins ...@@ -458,6 +458,10 @@ Core and Builtins
Library 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 #6631: Disallow relative file paths in urllib urlopen methods.
- Issue #13722: Avoid silencing ImportErrors when initializing the codecs - Issue #13722: Avoid silencing ImportErrors when initializing the codecs
......
...@@ -6551,7 +6551,6 @@ win_symlink(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -6551,7 +6551,6 @@ win_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
wchar_t *wsrc, *wdest; wchar_t *wsrc, *wdest;
int target_is_directory = 0; int target_is_directory = 0;
DWORD res; DWORD res;
WIN32_FILE_ATTRIBUTE_DATA src_info;
if (!check_CreateSymbolicLinkW()) if (!check_CreateSymbolicLinkW())
{ {
...@@ -6581,16 +6580,6 @@ win_symlink(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -6581,16 +6580,6 @@ win_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
if (wsrc == NULL) if (wsrc == NULL)
goto error; 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 Py_BEGIN_ALLOW_THREADS
res = Py_CreateSymbolicLinkW(wdest, wsrc, target_is_directory); res = Py_CreateSymbolicLinkW(wdest, wsrc, target_is_directory);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
......
...@@ -682,7 +682,7 @@ format_string_internal(PyObject *value, const InternalFormatSpec *format) ...@@ -682,7 +682,7 @@ format_string_internal(PyObject *value, const InternalFormatSpec *format)
Py_ssize_t pos; Py_ssize_t pos;
Py_ssize_t len = PyUnicode_GET_LENGTH(value); Py_ssize_t len = PyUnicode_GET_LENGTH(value);
PyObject *result = NULL; PyObject *result = NULL;
int maxchar = 127; Py_UCS4 maxchar = 127;
/* sign is not allowed on strings */ /* sign is not allowed on strings */
if (format->sign != '\0') { if (format->sign != '\0') {
...@@ -749,7 +749,7 @@ format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format, ...@@ -749,7 +749,7 @@ format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format,
IntOrLongToString tostring) IntOrLongToString tostring)
{ {
PyObject *result = NULL; PyObject *result = NULL;
int maxchar = 127; Py_UCS4 maxchar = 127;
PyObject *tmp = NULL; PyObject *tmp = NULL;
Py_ssize_t inumeric_chars; Py_ssize_t inumeric_chars;
Py_UCS4 sign_char = '\0'; Py_UCS4 sign_char = '\0';
...@@ -798,7 +798,7 @@ format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format, ...@@ -798,7 +798,7 @@ format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format,
tmp = PyUnicode_FromOrdinal(x); tmp = PyUnicode_FromOrdinal(x);
inumeric_chars = 0; inumeric_chars = 0;
n_digits = 1; 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 /* As a sort-of hack, we tell calc_number_widths that we only
have "remainder" characters. calc_number_widths thinks have "remainder" characters. calc_number_widths thinks
...@@ -926,7 +926,7 @@ format_float_internal(PyObject *value, ...@@ -926,7 +926,7 @@ format_float_internal(PyObject *value,
NumberFieldWidths spec; NumberFieldWidths spec;
int flags = 0; int flags = 0;
PyObject *result = NULL; PyObject *result = NULL;
int maxchar = 127; Py_UCS4 maxchar = 127;
Py_UCS4 sign_char = '\0'; Py_UCS4 sign_char = '\0';
int float_type; /* Used to see if we have a nan, inf, or regular float. */ int float_type; /* Used to see if we have a nan, inf, or regular float. */
PyObject *unicode_tmp = NULL; PyObject *unicode_tmp = NULL;
...@@ -1070,7 +1070,7 @@ format_complex_internal(PyObject *value, ...@@ -1070,7 +1070,7 @@ format_complex_internal(PyObject *value,
NumberFieldWidths im_spec; NumberFieldWidths im_spec;
int flags = 0; int flags = 0;
PyObject *result = NULL; PyObject *result = NULL;
int maxchar = 127; Py_UCS4 maxchar = 127;
int rkind; int rkind;
void *rdata; void *rdata;
Py_ssize_t index; Py_ssize_t index;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment