Issue #28353: os.fwalk() no longer fails on broken links.
This commit is contained in:
commit
af4e4747f5
|
@ -481,13 +481,13 @@ if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
|
||||||
dirs.append(name)
|
dirs.append(name)
|
||||||
else:
|
else:
|
||||||
nondirs.append(name)
|
nondirs.append(name)
|
||||||
except FileNotFoundError:
|
except OSError:
|
||||||
try:
|
try:
|
||||||
# Add dangling symlinks, ignore disappeared files
|
# Add dangling symlinks, ignore disappeared files
|
||||||
if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
|
if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
|
||||||
.st_mode):
|
.st_mode):
|
||||||
nondirs.append(name)
|
nondirs.append(name)
|
||||||
except FileNotFoundError:
|
except OSError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if topdown:
|
if topdown:
|
||||||
|
|
|
@ -853,38 +853,54 @@ class WalkTests(unittest.TestCase):
|
||||||
# SUB11/ no kids
|
# SUB11/ no kids
|
||||||
# SUB2/ a file kid and a dirsymlink kid
|
# SUB2/ a file kid and a dirsymlink kid
|
||||||
# tmp3
|
# tmp3
|
||||||
|
# SUB21/ not readable
|
||||||
|
# tmp5
|
||||||
# link/ a symlink to TESTFN.2
|
# link/ a symlink to TESTFN.2
|
||||||
# broken_link
|
# broken_link
|
||||||
|
# broken_link2
|
||||||
|
# broken_link3
|
||||||
# TEST2/
|
# TEST2/
|
||||||
# tmp4 a lone file
|
# tmp4 a lone file
|
||||||
self.walk_path = join(support.TESTFN, "TEST1")
|
self.walk_path = join(support.TESTFN, "TEST1")
|
||||||
self.sub1_path = join(self.walk_path, "SUB1")
|
self.sub1_path = join(self.walk_path, "SUB1")
|
||||||
self.sub11_path = join(self.sub1_path, "SUB11")
|
self.sub11_path = join(self.sub1_path, "SUB11")
|
||||||
sub2_path = join(self.walk_path, "SUB2")
|
sub2_path = join(self.walk_path, "SUB2")
|
||||||
|
sub21_path = join(sub2_path, "SUB21")
|
||||||
tmp1_path = join(self.walk_path, "tmp1")
|
tmp1_path = join(self.walk_path, "tmp1")
|
||||||
tmp2_path = join(self.sub1_path, "tmp2")
|
tmp2_path = join(self.sub1_path, "tmp2")
|
||||||
tmp3_path = join(sub2_path, "tmp3")
|
tmp3_path = join(sub2_path, "tmp3")
|
||||||
|
tmp5_path = join(sub21_path, "tmp3")
|
||||||
self.link_path = join(sub2_path, "link")
|
self.link_path = join(sub2_path, "link")
|
||||||
t2_path = join(support.TESTFN, "TEST2")
|
t2_path = join(support.TESTFN, "TEST2")
|
||||||
tmp4_path = join(support.TESTFN, "TEST2", "tmp4")
|
tmp4_path = join(support.TESTFN, "TEST2", "tmp4")
|
||||||
broken_link_path = join(sub2_path, "broken_link")
|
broken_link_path = join(sub2_path, "broken_link")
|
||||||
|
broken_link2_path = join(sub2_path, "broken_link2")
|
||||||
|
broken_link3_path = join(sub2_path, "broken_link3")
|
||||||
|
|
||||||
# Create stuff.
|
# Create stuff.
|
||||||
os.makedirs(self.sub11_path)
|
os.makedirs(self.sub11_path)
|
||||||
os.makedirs(sub2_path)
|
os.makedirs(sub2_path)
|
||||||
|
os.makedirs(sub21_path)
|
||||||
os.makedirs(t2_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, tmp4_path, tmp5_path:
|
||||||
with open(path, "x") as f:
|
with open(path, "x") as f:
|
||||||
f.write("I'm " + path + " and proud of it. Blame test_os.\n")
|
f.write("I'm " + path + " and proud of it. Blame test_os.\n")
|
||||||
|
|
||||||
if support.can_symlink():
|
if support.can_symlink():
|
||||||
os.symlink(os.path.abspath(t2_path), self.link_path)
|
os.symlink(os.path.abspath(t2_path), self.link_path)
|
||||||
os.symlink('broken', broken_link_path, True)
|
os.symlink('broken', broken_link_path, True)
|
||||||
self.sub2_tree = (sub2_path, ["link"], ["broken_link", "tmp3"])
|
os.symlink(join('tmp3', 'broken'), broken_link2_path, True)
|
||||||
|
os.symlink(join('SUB21', 'tmp5'), broken_link3_path, True)
|
||||||
|
self.sub2_tree = (sub2_path, ["link", "SUB21"],
|
||||||
|
["broken_link", "broken_link2", "broken_link3",
|
||||||
|
"tmp3"])
|
||||||
else:
|
else:
|
||||||
self.sub2_tree = (sub2_path, [], ["tmp3"])
|
self.sub2_tree = (sub2_path, [], ["tmp3"])
|
||||||
|
|
||||||
|
os.chmod(sub21_path, 0)
|
||||||
|
self.addCleanup(os.chmod, sub21_path, stat.S_IRWXU)
|
||||||
|
|
||||||
def test_walk_topdown(self):
|
def test_walk_topdown(self):
|
||||||
# Walk top-down.
|
# Walk top-down.
|
||||||
all = list(self.walk(self.walk_path))
|
all = list(self.walk(self.walk_path))
|
||||||
|
|
|
@ -29,6 +29,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #28353: os.fwalk() no longer fails on broken links.
|
||||||
|
|
||||||
- Issue #28430: Fix iterator of C implemented asyncio.Future doesn't accept
|
- Issue #28430: Fix iterator of C implemented asyncio.Future doesn't accept
|
||||||
non-None value is passed to it.send(val).
|
non-None value is passed to it.send(val).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue