Fix #13327. Remove the need for an explicit None as the second argument to

os.utime in order to update to the current time. The second argument is now
optional.
This commit is contained in:
Brian Curtin 2011-11-06 13:41:17 -06:00
parent 9589ab1745
commit 52fbea1d87
4 changed files with 36 additions and 17 deletions

View file

@ -2134,18 +2134,19 @@ Files and Directories
Availability: Unix, Windows.
.. function:: utime(path, times)
.. function:: utime(path[, times])
Set the access and modified times of the file specified by *path*. If *times*
is ``None``, then the file's access and modified times are set to the current
time. (The effect is similar to running the Unix program :program:`touch` on
the path.) Otherwise, *times* must be a 2-tuple of numbers, of the form
``(atime, mtime)`` which is used to set the access and modified times,
respectively. Whether a directory can be given for *path* depends on whether
the operating system implements directories as files (for example, Windows
does not). Note that the exact times you set here may not be returned by a
subsequent :func:`~os.stat` call, depending on the resolution with which your
operating system records access and modification times; see :func:`~os.stat`.
is ``None`` or not specified, then the file's access and modified times are
set to the current time. (The effect is similar to running the Unix program
:program:`touch` on the path.) Otherwise, *times* must be a 2-tuple of
numbers, of the form ``(atime, mtime)`` which is used to set the access and
modified times, respectively. Whether a directory can be given for *path*
depends on whether the operating system implements directories as files
(for example, Windows does not). Note that the exact times you set here may
not be returned by a subsequent :func:`~os.stat` call, depending on the
resolution with which your operating system records access and modification
times; see :func:`~os.stat`.
Availability: Unix, Windows.

View file

@ -270,6 +270,21 @@ class StatAttributeTests(unittest.TestCase):
st2 = os.stat(support.TESTFN)
self.assertEqual(st2.st_mtime, int(st.st_mtime-delta))
def test_utime_noargs(self):
# (insert issue#) removed the requirement to pass None as the
# second argument. Check that the previous methods of passing
# a time tuple or None work in addition to no argument.
st = os.stat(support.TESTFN)
# Doesn't set anything new, but sets the time tuple way
os.utime(support.TESTFN, (st.st_atime, st.st_mtime))
# Set to the current time in the old explicit way.
os.utime(support.TESTFN, None)
st1 = os.stat(support.TESTFN)
# Set to the current time in the new way
os.utime(support.TESTFN)
st2 = os.stat(support.TESTFN)
self.assertAlmostEqual(st1.st_mtime, st2.st_mtime, delta=10)
# Restrict test to Win32, since there is no guarantee other
# systems support centiseconds
if sys.platform == 'win32':

View file

@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins
-----------------
- Issue #13327: Remove the need for an explicit None as the second argument
to os.utime in order to update to the current time.
- Issue #13350: Simplify some C code by replacing most usages of
PyUnicode_Format by PyUnicode_FromFormat.

View file

@ -3543,7 +3543,7 @@ static PyObject *
posix_utime(PyObject *self, PyObject *args)
{
#ifdef MS_WINDOWS
PyObject *arg;
PyObject *arg = NULL;
PyObject *obwpath;
wchar_t *wpath = NULL;
PyObject *oapath;
@ -3554,7 +3554,7 @@ posix_utime(PyObject *self, PyObject *args)
FILETIME atime, mtime;
PyObject *result = NULL;
if (PyArg_ParseTuple(args, "UO|:utime", &obwpath, &arg)) {
if (PyArg_ParseTuple(args, "U|O:utime", &obwpath, &arg)) {
wpath = PyUnicode_AsUnicode(obwpath);
if (wpath == NULL)
return NULL;
@ -3571,7 +3571,7 @@ posix_utime(PyObject *self, PyObject *args)
are also valid. */
PyErr_Clear();
if (!PyArg_ParseTuple(args, "O&O:utime",
if (!PyArg_ParseTuple(args, "O&|O:utime",
PyUnicode_FSConverter, &oapath, &arg))
return NULL;
@ -3589,7 +3589,7 @@ posix_utime(PyObject *self, PyObject *args)
Py_DECREF(oapath);
}
if (arg == Py_None) {
if (!arg || (arg == Py_None)) {
SYSTEMTIME now;
GetSystemTime(&now);
if (!SystemTimeToFileTime(&now, &mtime) ||
@ -3633,13 +3633,13 @@ done:
time_t atime, mtime;
long ausec, musec;
int res;
PyObject* arg;
PyObject* arg = NULL;
if (!PyArg_ParseTuple(args, "O&O:utime",
if (!PyArg_ParseTuple(args, "O&|O:utime",
PyUnicode_FSConverter, &opath, &arg))
return NULL;
path = PyBytes_AsString(opath);
if (arg == Py_None) {
if (!arg || (arg == Py_None)) {
/* optional time values not given */
Py_BEGIN_ALLOW_THREADS
res = utime(path, NULL);