stage: fix resources being deleted from local cache (#10152)

Non-expanded resources were being deleted from the cache on account
of two behaviors:

* ResourceStage was moving files rather than copying them, and uses
  "os.path.realpath" to resolve symlinks
* CacheFetchStrategy creates a symlink to a cached resource rather
  than copying it

This alters the first behavior: ResourceStage now copies the file
rather than moving it.
This commit is contained in:
Michael Kuhn 2018-12-19 14:08:39 +01:00 committed by Peter Scheibel
parent 5450303c97
commit 41ef02ee10

View File

@ -8,7 +8,6 @@
import sys import sys
import errno import errno
import hashlib import hashlib
import shutil
import tempfile import tempfile
import getpass import getpass
from six import string_types from six import string_types
@ -16,7 +15,7 @@
from six.moves.urllib.parse import urljoin from six.moves.urllib.parse import urljoin
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.filesystem import mkdirp, can_access from llnl.util.filesystem import mkdirp, can_access, copy, copy_tree
from llnl.util.filesystem import remove_if_dead_link, remove_linked_tree from llnl.util.filesystem import remove_if_dead_link, remove_linked_tree
import spack.paths import spack.paths
@ -406,7 +405,7 @@ def generate_fetchers():
self.fetcher = fetcher self.fetcher = fetcher
self.fetcher.fetch() self.fetcher.fetch()
break break
except spack.fetch_strategy.NoCacheError as e: except spack.fetch_strategy.NoCacheError:
# Don't bother reporting when something is not cached. # Don't bother reporting when something is not cached.
continue continue
except spack.error.SpackError as e: except spack.error.SpackError as e:
@ -545,7 +544,13 @@ def _add_to_root_stage(self):
'{stage}\n\tdestination : {destination}'.format( '{stage}\n\tdestination : {destination}'.format(
stage=source_path, destination=destination_path stage=source_path, destination=destination_path
)) ))
shutil.move(os.path.realpath(source_path), destination_path)
src = os.path.realpath(source_path)
if os.path.isdir(src):
copy_tree(src, destination_path)
else:
copy(src, destination_path)
@pattern.composite(method_list=[ @pattern.composite(method_list=[