Issue #8746: Correct faulty configure checks so that os.chflags() and

os.lchflags() are once again built on systems that support these
functions (*BSD and OS X).  Also add new stat file flags for OS X
(UF_HIDDEN and UF_COMPRESSED).  Also add additional tests for
os.chflags() and os.lchflags(). (Tests by Garrett Cooper)
This commit is contained in:
Ned Deily 2011-06-28 00:13:01 -07:00
commit 8b56c4b1b8
9 changed files with 82 additions and 26 deletions

View File

@ -1465,6 +1465,8 @@ Files and Directories
* :data:`stat.UF_APPEND`
* :data:`stat.UF_OPAQUE`
* :data:`stat.UF_NOUNLINK`
* :data:`stat.UF_COMPRESSED`
* :data:`stat.UF_HIDDEN`
* :data:`stat.SF_ARCHIVED`
* :data:`stat.SF_IMMUTABLE`
* :data:`stat.SF_APPEND`

View File

@ -307,13 +307,21 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`:
The file may only be appended to.
.. data:: UF_OPAQUE
The directory is opaque when viewed through a union stack.
.. data:: UF_NOUNLINK
The file may not be renamed or deleted.
.. data:: UF_OPAQUE
.. data:: UF_COMPRESSED
The directory is opaque when viewed through a union stack.
The file is stored compressed (Mac OS X 10.6+).
.. data:: UF_HIDDEN
The file should not be displayed in a GUI (Mac OS X 10.5+).
.. data:: SF_ARCHIVED

View File

@ -87,6 +87,8 @@ UF_IMMUTABLE = 0x00000002
UF_APPEND = 0x00000004
UF_OPAQUE = 0x00000008
UF_NOUNLINK = 0x00000010
UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed
UF_HIDDEN = 0x00008000 # OS X: file should not be displayed
SF_ARCHIVED = 0x00010000
SF_IMMUTABLE = 0x00020000
SF_APPEND = 0x00040000

View File

@ -16,6 +16,7 @@ import stat
import unittest
import warnings
_DUMMY_SYMLINK = '%s/dummy-symlink' % os.getenv('TMPDIR', '/tmp')
class PosixTester(unittest.TestCase):
@ -23,13 +24,15 @@ class PosixTester(unittest.TestCase):
# create empty file
fp = open(support.TESTFN, 'w+')
fp.close()
self.teardown_files = [ support.TESTFN ]
self._warnings_manager = support.check_warnings()
self._warnings_manager.__enter__()
warnings.filterwarnings('ignore', '.* potential security risk .*',
RuntimeWarning)
def tearDown(self):
support.unlink(support.TESTFN)
for teardown_file in self.teardown_files:
support.unlink(teardown_file)
self._warnings_manager.__exit__(None, None, None)
def testNoArgFunctions(self):
@ -426,7 +429,7 @@ class PosixTester(unittest.TestCase):
def test_lchown(self):
os.unlink(support.TESTFN)
# create a symlink
os.symlink('/tmp/dummy-symlink-target', support.TESTFN)
os.symlink(_DUMMY_SYMLINK, support.TESTFN)
self._test_all_chown_common(posix.lchown, support.TESTFN)
def test_chdir(self):
@ -511,17 +514,49 @@ class PosixTester(unittest.TestCase):
posix.utime(support.TESTFN, (int(now), int(now)))
posix.utime(support.TESTFN, (now, now))
def test_chflags(self):
if hasattr(posix, 'chflags'):
st = os.stat(support.TESTFN)
if hasattr(st, 'st_flags'):
posix.chflags(support.TESTFN, st.st_flags)
def _test_chflags_regular_file(self, chflags_func, target_file):
st = os.stat(target_file)
self.assertTrue(hasattr(st, 'st_flags'))
chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
try:
new_st = os.stat(target_file)
self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
try:
fd = open(target_file, 'w+')
except IOError as e:
self.assertEqual(e.errno, errno.EPERM)
finally:
posix.chflags(target_file, st.st_flags)
def test_lchflags(self):
if hasattr(posix, 'lchflags'):
st = os.stat(support.TESTFN)
if hasattr(st, 'st_flags'):
posix.lchflags(support.TESTFN, st.st_flags)
@unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
def test_chflags(self):
self._test_chflags_regular_file(posix.chflags, support.TESTFN)
@unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
def test_lchflags_regular_file(self):
self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
@unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
def test_lchflags_symlink(self):
testfn_st = os.stat(support.TESTFN)
self.assertTrue(hasattr(testfn_st, 'st_flags'))
os.symlink(support.TESTFN, _DUMMY_SYMLINK)
self.teardown_files.append(_DUMMY_SYMLINK)
dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
posix.lchflags(_DUMMY_SYMLINK,
dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
try:
new_testfn_st = os.stat(support.TESTFN)
new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
new_dummy_symlink_st.st_flags)
finally:
posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
def test_environ(self):
if os.name == "nt":

View File

@ -191,6 +191,7 @@ Juan José Conti
Matt Conway
David M. Cooke
Jason R. Coombs
Garrett Cooper
Greg Copeland
Aldo Cortesi
David Costanzo

View File

@ -857,6 +857,11 @@ Library
Build
-----
- Issue #8746: Correct faulty configure checks so that os.chflags() and
os.lchflags() are once again built on systems that support these
functions (*BSD and OS X). Also add new stat file flags for OS X
(UF_HIDDEN and UF_COMPRESSED).
- Issue #10645: Installing Python does no longer create a
Python-X.Y.Z-pyX.Y.egg-info file in the lib-dynload directory.
@ -908,6 +913,9 @@ Extension Modules
Tests
-----
- Issue #8746: Add additional tests for os.chflags() and os.lchflags().
Patch by Garrett Cooper.
- Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9
2.8 + on Mac OS X. (Patch by Ronald Oussoren)

8
configure vendored
View File

@ -9912,7 +9912,7 @@ else
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
[
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char*argv[])
@ -9921,7 +9921,7 @@ int main(int argc, char*argv[])
return 1;
return 0;
}
]
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
ac_cv_have_chflags=yes
@ -9961,7 +9961,7 @@ else
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
[
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char*argv[])
@ -9970,7 +9970,7 @@ int main(int argc, char*argv[])
return 1;
return 0;
}
]
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
ac_cv_have_lchflags=yes

View File

@ -2675,7 +2675,7 @@ AC_CHECK_LIB(c, inet_aton, [$ac_cv_prog_TRUE],
# On Tru64, chflags seems to be present, but calling it will
# exit Python
AC_CACHE_CHECK([for chflags], [ac_cv_have_chflags], [dnl
AC_RUN_IFELSE([AC_LANG_SOURCE([[[
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char*argv[])
@ -2684,7 +2684,7 @@ int main(int argc, char*argv[])
return 1;
return 0;
}
]]])],
]])],
[ac_cv_have_chflags=yes],
[ac_cv_have_chflags=no],
[ac_cv_have_chflags=cross])
@ -2693,11 +2693,11 @@ if test "$ac_cv_have_chflags" = cross ; then
AC_CHECK_FUNC([chflags], [ac_cv_have_chflags="yes"], [ac_cv_have_chflags="no"])
fi
if test "$ac_cv_have_chflags" = yes ; then
AC_DEFINE(HAVE_CHFLAGS, 1, [Define to 1 if you have the `chflags' function.])
AC_DEFINE(HAVE_CHFLAGS, 1, [Define to 1 if you have the 'chflags' function.])
fi
AC_CACHE_CHECK([for lchflags], [ac_cv_have_lchflags], [dnl
AC_RUN_IFELSE([AC_LANG_SOURCE([[[
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char*argv[])
@ -2706,13 +2706,13 @@ int main(int argc, char*argv[])
return 1;
return 0;
}
]]])],[ac_cv_have_lchflags=yes],[ac_cv_have_lchflags=no],[ac_cv_have_lchflags=cross])
]])],[ac_cv_have_lchflags=yes],[ac_cv_have_lchflags=no],[ac_cv_have_lchflags=cross])
])
if test "$ac_cv_have_lchflags" = cross ; then
AC_CHECK_FUNC([lchflags], [ac_cv_have_lchflags="yes"], [ac_cv_have_lchflags="no"])
fi
if test "$ac_cv_have_lchflags" = yes ; then
AC_DEFINE(HAVE_LCHFLAGS, 1, [Define to 1 if you have the `lchflags' function.])
AC_DEFINE(HAVE_LCHFLAGS, 1, [Define to 1 if you have the 'lchflags' function.])
fi
dnl Check if system zlib has *Copy() functions

View File

@ -101,7 +101,7 @@
/* Define this if you have the type _Bool. */
#undef HAVE_C99_BOOL
/* Define to 1 if you have the `chflags' function. */
/* Define to 1 if you have the 'chflags' function. */
#undef HAVE_CHFLAGS
/* Define to 1 if you have the `chown' function. */
@ -428,7 +428,7 @@
Solaris and Linux, the necessary defines are already defined.) */
#undef HAVE_LARGEFILE_SUPPORT
/* Define to 1 if you have the `lchflags' function. */
/* Define to 1 if you have the 'lchflags' function. */
#undef HAVE_LCHFLAGS
/* Define to 1 if you have the `lchmod' function. */