Commit 52fbea1d authored by Brian Curtin's avatar Brian Curtin

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.
parent 9589ab17
......@@ -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.
......
......@@ -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':
......
......@@ -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.
......
......@@ -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);
......
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