Try backing out 54407 to see if it corrects the problems on the Windows
authorNeal Norwitz <nnorwitz@gmail.com>
Tue, 20 Mar 2007 05:23:09 +0000 (05:23 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Tue, 20 Mar 2007 05:23:09 +0000 (05:23 +0000)
buildbots.  This rev was backported, so we will need to keep both branches
in sync, pending the outcome of the test after this checkin.

Doc/lib/libos.tex
Lib/os.py
Lib/test/test_os.py
Misc/NEWS

index 638ed6b6ed20730b48ab4b5886a32fceca4a31b2..1a39693b80a610ba262e93cf3fd9450e23f69b35 100644 (file)
@@ -1233,8 +1233,7 @@ Availability: Macintosh, \UNIX, Windows.
 \end{funcdesc}
 
 \begin{funcdesc}{walk}{top\optional{, topdown\code{=True}
-                       \optional{, onerror\code{=None}\optional{,
-                      followlinks\code{=False}}}}}
+                       \optional{, onerror\code{=None}}}}
 \index{directory!walking}
 \index{directory!traversal}
 \function{walk()} generates the file names in a directory tree, by
@@ -1274,18 +1273,8 @@ report the error to continue with the walk, or raise the exception
 to abort the walk.  Note that the filename is available as the
 \code{filename} attribute of the exception object.
 
-By default, \function{walk()} will not walk down into symbolic links that
-resolve to directories. Set \var{followlinks} to True to visit directories
-pointed to by symlinks, on systems that support them.
-
 \versionadded[The \var{followlinks} parameter]{2.6}
 
-\begin{notice}
-Be aware that setting \var{followlinks} to true can lead to infinite recursion
-if a link points to a parent directory of itself. \function{walk()} does not
-keep track of the directories it visited already.
-\end{notice}
-
 \begin{notice}
 If you pass a relative pathname, don't change the current working
 directory between resumptions of \function{walk()}.  \function{walk()}
@@ -1293,6 +1282,15 @@ never changes the current directory, and assumes that its caller
 doesn't either.
 \end{notice}
 
+\begin{notice}
+On systems that support symbolic links, links to subdirectories appear
+in \var{dirnames} lists, but \function{walk()} will not visit them
+(infinite loops are hard to avoid when following symbolic links).
+To visit linked directories, you can identify them with
+\code{os.path.islink(\var{path})}, and invoke \code{walk(\var{path})}
+on each directly.
+\end{notice}
+
 This example displays the number of bytes taken by non-directory files
 in each directory under the starting directory, except that it doesn't
 look under any CVS subdirectory:
index 991716ed1fab824554212420370ce0dcd761f133..c8cc274ec829c6fe833265ad15d8ccae4d375f04 100644 (file)
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -221,7 +221,7 @@ def renames(old, new):
 
 __all__.extend(["makedirs", "removedirs", "renames"])
 
-def walk(top, topdown=True, onerror=None, followlinks=False):
+def walk(top, topdown=True, onerror=None):
     """Directory tree generator.
 
     For each directory in the directory tree rooted at top (including top
@@ -257,10 +257,6 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
     to abort the walk.  Note that the filename is available as the
     filename attribute of the exception object.
 
-    By default, os.walk does not follow symbolic links to subdirectories on
-    systems that support them.  In order to get this functionality, set the
-    optional argument 'followlinks' to true.
-
     Caution:  if you pass a relative pathname for top, don't change the
     current working directory between resumptions of walk.  walk never
     changes the current directory, and assumes that the client doesn't
@@ -304,8 +300,8 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
         yield top, dirs, nondirs
     for name in dirs:
         path = join(top, name)
-        if followlinks or not islink(path):
-            for x in walk(path, topdown, onerror, followlinks):
+        if not islink(path):
+            for x in walk(path, topdown, onerror):
                 yield x
     if not topdown:
         yield top, dirs, nondirs
index a40dd5eb254d56df18f74119d6df53e95211a838..9dcdb1808fc11f182b1cdace8545bd168b33a2bb 100644 (file)
@@ -277,34 +277,22 @@ class WalkTests(unittest.TestCase):
         #         SUB1/             a file kid and a directory kid
         #             tmp2
         #             SUB11/        no kids
-        #         SUB2/             a file kid and a dirsymlink kid
+        #         SUB2/             just a file kid
         #             tmp3
-        #             link/         a symlink to TESTFN.2
-        #     TESTFN.2/
-        #         tmp4              a lone file
         sub1_path = join(test_support.TESTFN, "SUB1")
         sub11_path = join(sub1_path, "SUB11")
         sub2_path = join(test_support.TESTFN, "SUB2")
         tmp1_path = join(test_support.TESTFN, "tmp1")
         tmp2_path = join(sub1_path, "tmp2")
         tmp3_path = join(sub2_path, "tmp3")
-        link_path = join(sub2_path, "link")
-        t2_path = join(test_support.TESTFN + ".2")
-        tmp4_path = join(test_support.TESTFN + ".2", "tmp4")
 
         # Create stuff.
         os.makedirs(sub11_path)
         os.makedirs(sub2_path)
-        os.makedirs(t2_path)
-        for path in tmp1_path, tmp2_path, tmp3_path, tmp4_path:
+        for path in tmp1_path, tmp2_path, tmp3_path:
             f = file(path, "w")
             f.write("I'm " + path + " and proud of it.  Blame test_os.\n")
             f.close()
-        if hasattr(os, "symlink"):
-            os.symlink(os.path.join("..", "..", t2_path), link_path)
-        else:
-            # it must be a directory because the test expects that
-            os.mkdir(link_path)
 
         # Walk top-down.
         all = list(os.walk(test_support.TESTFN))
@@ -317,7 +305,7 @@ class WalkTests(unittest.TestCase):
         self.assertEqual(all[0], (test_support.TESTFN, ["SUB1", "SUB2"], ["tmp1"]))
         self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"]))
         self.assertEqual(all[2 + flipped], (sub11_path, [], []))
-        self.assertEqual(all[3 - 2 * flipped], (sub2_path, ["link"], ["tmp3"]))
+        self.assertEqual(all[3 - 2 * flipped], (sub2_path, [], ["tmp3"]))
 
         # Prune the search.
         all = []
@@ -329,7 +317,7 @@ class WalkTests(unittest.TestCase):
                 dirs.remove('SUB1')
         self.assertEqual(len(all), 2)
         self.assertEqual(all[0], (test_support.TESTFN, ["SUB2"], ["tmp1"]))
-        self.assertEqual(all[1], (sub2_path, ["link"], ["tmp3"]))
+        self.assertEqual(all[1], (sub2_path, [], ["tmp3"]))
 
         # Walk bottom-up.
         all = list(os.walk(test_support.TESTFN, topdown=False))
@@ -342,17 +330,7 @@ class WalkTests(unittest.TestCase):
         self.assertEqual(all[3], (test_support.TESTFN, ["SUB1", "SUB2"], ["tmp1"]))
         self.assertEqual(all[flipped], (sub11_path, [], []))
         self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"]))
-        self.assertEqual(all[2 - 2 * flipped], (sub2_path, ["link"], ["tmp3"]))
-
-        # Walk, following symlinks.
-        for root, dirs, files in os.walk(test_support.TESTFN, followlinks=True):
-            if root == link_path:
-                self.assertEqual(dirs, [])
-                self.assertEqual(files, ["tmp4"])
-                break
-        else:
-            self.fail("Didn't follow symlink with followlinks=True")
-        
+        self.assertEqual(all[2 - 2 * flipped], (sub2_path, [], ["tmp3"]))
 
         # Tear everything down.  This is a decent use for bottom-up on
         # Windows, which doesn't have a recursive delete command.  The
@@ -362,14 +340,8 @@ class WalkTests(unittest.TestCase):
             for name in files:
                 os.remove(join(root, name))
             for name in dirs:
-                dirname = join(root, name)
-                if not os.path.islink(dirname):
-                    os.rmdir(dirname)
-                else:
-                    os.remove(dirname)
+                os.rmdir(join(root, name))
         os.rmdir(test_support.TESTFN)
-        os.unlink(tmp4_path)
-        os.rmdir(t2_path)
 
 class MakedirTests (unittest.TestCase):
     def setUp(self):
index 419120e4dd005e6d790444463b63a0df3c4db463..c6e48bd0e24992fb7c113243fe804e41cb29e86a 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -189,10 +189,6 @@ Library
 
 - Patch #1630118: add a SpooledTemporaryFile class to tempfile.py.
 
-- Patch #1273829: os.walk() now has a "followlinks" parameter. If set to
-  True (which is not the default), it visits symlinks pointing to
-  directories.
-
 - Bug #1681228: the webbrowser module now correctly uses the default
   GNOME or KDE browser, depending on whether there is a session of one
   of those present. Also, it tries the Windows default browser before