Browse Source

Revert "bpo-39413: Implement os.unsetenv() on Windows (GH-18104)" (GH-18124)

This reverts commit 56cd3710a1.
pull/18126/head
Victor Stinner 6 years ago
committed by GitHub
parent
commit
b73dd02ea7
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      Doc/library/os.rst
  2. 3
      Doc/whatsnew/3.9.rst
  3. 11
      Lib/test/test_os.py
  4. 1
      Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst
  5. 42
      Modules/clinic/posixmodule.c.h
  6. 46
      Modules/posixmodule.c

3
Doc/library/os.rst

@ -645,9 +645,6 @@ process and user.
.. availability:: most flavors of Unix, Windows.
.. versionchanged:: 3.9
The function is now also available on Windows.
.. _os-newstreams:

3
Doc/whatsnew/3.9.rst

@ -216,9 +216,6 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and
:data:`os.P_PIDFD` (:issue:`38713`) for process management with file
descriptors.
The :func:`os.unsetenv` function is now also available on Windows.
(Contributed by Victor Stinner in :issue:`39413`.)
poplib
------

11
Lib/test/test_os.py

@ -956,9 +956,14 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
# On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415).
@support.requires_mac_ver(10, 6)
def test_unset_error(self):
# "=" is not allowed in a variable name
key = 'key='
self.assertRaises(OSError, os.environ.__delitem__, key)
if sys.platform == "win32":
# an environment variable is limited to 32,767 characters
key = 'x' * 50000
self.assertRaises(ValueError, os.environ.__delitem__, key)
else:
# "=" is not allowed in a variable name
key = 'key='
self.assertRaises(OSError, os.environ.__delitem__, key)
def test_key_type(self):
missing = 'missingkey'

1
Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst

@ -1 +0,0 @@
The :func:`os.unsetenv` function is now also available on Windows.

42
Modules/clinic/posixmodule.c.h

@ -6125,43 +6125,7 @@ exit:
#endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */
#if defined(MS_WINDOWS)
PyDoc_STRVAR(os_unsetenv__doc__,
"unsetenv($module, name, /)\n"
"--\n"
"\n"
"Delete an environment variable.");
#define OS_UNSETENV_METHODDEF \
{"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__},
static PyObject *
os_unsetenv_impl(PyObject *module, PyObject *name);
static PyObject *
os_unsetenv(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
PyObject *name;
if (!PyUnicode_Check(arg)) {
_PyArg_BadArgument("unsetenv", "argument", "str", arg);
goto exit;
}
if (PyUnicode_READY(arg) == -1) {
goto exit;
}
name = arg;
return_value = os_unsetenv_impl(module, name);
exit:
return return_value;
}
#endif /* defined(MS_WINDOWS) */
#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS))
#if defined(HAVE_UNSETENV)
PyDoc_STRVAR(os_unsetenv__doc__,
"unsetenv($module, name, /)\n"
@ -6193,7 +6157,7 @@ exit:
return return_value;
}
#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */
#endif /* defined(HAVE_UNSETENV) */
PyDoc_STRVAR(os_strerror__doc__,
"strerror($module, code, /)\n"
@ -8809,4 +8773,4 @@ exit:
#ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF
#define OS__REMOVE_DLL_DIRECTORY_METHODDEF
#endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */
/*[clinic end generated code: output=6e739a2715712e88 input=a9049054013a1b77]*/
/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/

46
Modules/posixmodule.c

@ -10180,51 +10180,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value)
#endif /* HAVE_PUTENV */
#ifdef MS_WINDOWS
/*[clinic input]
os.unsetenv
name: unicode
/
Delete an environment variable.
[clinic start generated code]*/
static PyObject *
os_unsetenv_impl(PyObject *module, PyObject *name)
/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/
{
/* PyUnicode_AsWideCharString() rejects embedded null characters */
wchar_t *name_str = PyUnicode_AsWideCharString(name, NULL);
if (name_str == NULL) {
return NULL;
}
BOOL ok = SetEnvironmentVariableW(name_str, NULL);
PyMem_Free(name_str);
if (!ok) {
return PyErr_SetFromWindowsErr(0);
}
#ifdef PY_PUTENV_DICT
/* Remove the key from putenv_dict;
* this will cause it to be collected. This has to
* happen after the real unsetenv() call because the
* old value was still accessible until then.
*/
if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) {
/* really not much we can do; just leak */
if (!PyErr_ExceptionMatches(PyExc_KeyError)) {
return NULL;
}
PyErr_Clear();
}
#endif
Py_RETURN_NONE;
}
/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */
#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)
#ifdef HAVE_UNSETENV
/*[clinic input]
os.unsetenv
name: FSConverter

Loading…
Cancel
Save