_cleanup_dead_links : factored method into a function and put it in llnl.filesystem
This commit is contained in:
parent
9001b9ed3c
commit
901e4851b9
@ -25,7 +25,7 @@
|
|||||||
__all__ = ['set_install_permissions', 'install', 'install_tree', 'traverse_tree',
|
__all__ = ['set_install_permissions', 'install', 'install_tree', 'traverse_tree',
|
||||||
'expand_user', 'working_dir', 'touch', 'touchp', 'mkdirp',
|
'expand_user', 'working_dir', 'touch', 'touchp', 'mkdirp',
|
||||||
'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file',
|
'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file',
|
||||||
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink']
|
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink', 'remove_dead_links']
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@ -235,7 +235,7 @@ def touchp(path):
|
|||||||
def force_symlink(src, dest):
|
def force_symlink(src, dest):
|
||||||
try:
|
try:
|
||||||
os.symlink(src, dest)
|
os.symlink(src, dest)
|
||||||
except OSError, e:
|
except OSError as e:
|
||||||
os.remove(dest)
|
os.remove(dest)
|
||||||
os.symlink(src, dest)
|
os.symlink(src, dest)
|
||||||
|
|
||||||
@ -339,3 +339,18 @@ def traverse_tree(source_root, dest_root, rel_path='', **kwargs):
|
|||||||
|
|
||||||
if order == 'post':
|
if order == 'post':
|
||||||
yield (source_path, dest_path)
|
yield (source_path, dest_path)
|
||||||
|
|
||||||
|
def remove_dead_links(root):
|
||||||
|
"""
|
||||||
|
Removes any dead link that is present in root
|
||||||
|
|
||||||
|
Args:
|
||||||
|
root: path where to search for dead links
|
||||||
|
|
||||||
|
"""
|
||||||
|
for file in os.listdir(root):
|
||||||
|
path = join_path(root, file)
|
||||||
|
if os.path.islink(path):
|
||||||
|
real_path = os.path.realpath(path)
|
||||||
|
if not os.path.exists(real_path):
|
||||||
|
os.unlink(path)
|
@ -98,7 +98,7 @@ def __init__(self, url_or_fetch_strategy, **kwargs):
|
|||||||
# Try to construct here a temporary name for the stage directory
|
# Try to construct here a temporary name for the stage directory
|
||||||
# If this is a named stage, then construct a named path.
|
# If this is a named stage, then construct a named path.
|
||||||
self.path = join_path(spack.stage_path, self.name)
|
self.path = join_path(spack.stage_path, self.name)
|
||||||
|
# Flag to decide whether to delete the stage folder on exit or not
|
||||||
self.delete_on_exit = True
|
self.delete_on_exit = True
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
@ -113,20 +113,17 @@ def __enter__(self):
|
|||||||
"""
|
"""
|
||||||
# Create the top-level stage directory
|
# Create the top-level stage directory
|
||||||
mkdirp(spack.stage_path)
|
mkdirp(spack.stage_path)
|
||||||
self._cleanup_dead_links()
|
remove_dead_links(spack.stage_path)
|
||||||
|
|
||||||
# If this is a temporary stage, them make the temp directory
|
# If a tmp_root exists then create a directory there and then link it in the stage area,
|
||||||
|
# otherwise create the stage directory in self.path
|
||||||
if self.tmp_root:
|
if self.tmp_root:
|
||||||
if self._need_to_create_path():
|
if self._need_to_create_path():
|
||||||
tmp_dir = tempfile.mkdtemp('', STAGE_PREFIX, self.tmp_root)
|
tmp_dir = tempfile.mkdtemp('', STAGE_PREFIX, self.tmp_root)
|
||||||
os.symlink(tmp_dir, self.path)
|
os.symlink(tmp_dir, self.path)
|
||||||
|
|
||||||
# if we're not using a tmp dir, create the stage directly in the
|
|
||||||
# stage dir, rather than linking to it.
|
|
||||||
else:
|
else:
|
||||||
if self._need_to_create_path():
|
if self._need_to_create_path():
|
||||||
mkdirp(self.path)
|
mkdirp(self.path)
|
||||||
|
|
||||||
# Make sure we can actually do something with the stage we made.
|
# Make sure we can actually do something with the stage we made.
|
||||||
ensure_access(self.path)
|
ensure_access(self.path)
|
||||||
|
|
||||||
@ -151,15 +148,6 @@ def __exit__(self, exc_type, exc_val, exc_tb):
|
|||||||
if self.delete_on_exit:
|
if self.delete_on_exit:
|
||||||
self.destroy()
|
self.destroy()
|
||||||
|
|
||||||
def _cleanup_dead_links(self):
|
|
||||||
"""Remove any dead links in the stage directory."""
|
|
||||||
for file in os.listdir(spack.stage_path):
|
|
||||||
path = join_path(spack.stage_path, file)
|
|
||||||
if os.path.islink(path):
|
|
||||||
real_path = os.path.realpath(path)
|
|
||||||
if not os.path.exists(real_path):
|
|
||||||
os.unlink(path)
|
|
||||||
|
|
||||||
def _need_to_create_path(self):
|
def _need_to_create_path(self):
|
||||||
"""Makes sure nothing weird has happened since the last time we
|
"""Makes sure nothing weird has happened since the last time we
|
||||||
looked at path. Returns True if path already exists and is ok.
|
looked at path. Returns True if path already exists and is ok.
|
||||||
|
Loading…
Reference in New Issue
Block a user