Skip to content

Commit

Permalink
Merge pull request #4148 from RonnyPfannschmidt/pathlib-cleanup-symli…
Browse files Browse the repository at this point in the history
…nk-is-fine

fix #4135 - handle symlinks in tmp path cleanup
  • Loading branch information
RonnyPfannschmidt authored Oct 15, 2018
2 parents 0be84cd + ced62f3 commit 5b0f887
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
1 change: 1 addition & 0 deletions changelog/4135.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pathlib based tmpdir cleanup now correctly handles symlinks in the folder.
2 changes: 2 additions & 0 deletions src/_pytest/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ def delete_a_numbered_dir(path):

def ensure_deletable(path, consider_lock_dead_if_created_before):
"""checks if a lock exists and breaks it if its considered dead"""
if path.is_symlink():
return False
lock = get_lock_path(path)
if not lock.exists():
return True
Expand Down
32 changes: 25 additions & 7 deletions testing/test_tmpdir.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from __future__ import absolute_import, division, print_function
import sys
import py

import six

import pytest
from _pytest.pathlib import Path


def test_tmpdir_fixture(testdir):
Expand Down Expand Up @@ -65,10 +68,6 @@ def test_1():
assert mytemp.join("hello").check()


@pytest.mark.skipif(
not hasattr(py.path.local, "mksymlinkto"),
reason="symlink not available on this platform",
)
def test_tmpdir_always_is_realpath(testdir):
# the reason why tmpdir should be a realpath is that
# when you cd to it and do "os.getcwd()" you will anyway
Expand All @@ -78,7 +77,7 @@ def test_tmpdir_always_is_realpath(testdir):
# os.environ["PWD"]
realtemp = testdir.tmpdir.mkdir("myrealtemp")
linktemp = testdir.tmpdir.join("symlinktemp")
linktemp.mksymlinkto(realtemp)
attempt_symlink_to(linktemp, str(realtemp))
p = testdir.makepyfile(
"""
def test_1(tmpdir):
Expand Down Expand Up @@ -232,7 +231,7 @@ def test_lock_register_cleanup_removal(self, tmp_path):

assert not lock.exists()

def test_cleanup_keep(self, tmp_path):
def _do_cleanup(self, tmp_path):
self.test_make(tmp_path)
from _pytest.pathlib import cleanup_numbered_dir

Expand All @@ -242,6 +241,9 @@ def test_cleanup_keep(self, tmp_path):
keep=2,
consider_lock_dead_if_created_before=0,
)

def test_cleanup_keep(self, tmp_path):
self._do_cleanup(tmp_path)
a, b = tmp_path.iterdir()
print(a, b)

Expand Down Expand Up @@ -275,3 +277,19 @@ def test_rmtree(self, tmp_path):

rmtree(adir, force=True)
assert not adir.exists()

def test_cleanup_symlink(self, tmp_path):
the_symlink = tmp_path / (self.PREFIX + "current")
attempt_symlink_to(the_symlink, tmp_path / (self.PREFIX + "5"))
self._do_cleanup(tmp_path)


def attempt_symlink_to(path, to_path):
"""Try to make a symlink from "path" to "to_path", skipping in case this platform
does not support it or we don't have sufficient privileges (common on Windows)."""
if sys.platform.startswith("win") and six.PY2:
pytest.skip("pathlib for some reason cannot make symlinks on Python 2")
try:
Path(path).symlink_to(Path(to_path))
except OSError:
pytest.skip("could not create symbolic link")

0 comments on commit 5b0f887

Please sign in to comment.