bugfix: allow fetching no-code packages (#13429)

Previously, spack would error out if we tried to fetch something with no
code, but that would prevent fetching dependencies. In particular, this
would fail:

    spack fetch --dependencies xsdk

- [x] Instead of raising an error, just print a message that there is nothing
      to be fetched for packages like xsdk that do not have code.

- [x] Make BundleFetchStrategy a bit more quiet about doing nothing.
This commit is contained in:
Todd Gamblin 2019-10-24 16:02:28 -07:00 committed by GitHub
parent 757387dc2a
commit dbee91f7f1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 22 deletions

View file

@ -201,28 +201,16 @@ class BundleFetchStrategy(FetchStrategy):
url_attr = ''
def fetch(self):
tty.msg("No code to fetch.")
"""Simply report success -- there is no code to fetch."""
return True
def check(self):
tty.msg("No code to check.")
def expand(self):
tty.msg("No archive to expand.")
def reset(self):
tty.msg("No code to reset.")
def archive(self, destination):
tty.msg("No code to archive.")
@property
def cachable(self):
tty.msg("No code to cache.")
"""Report False as there is no code to cache."""
return False
def source_id(self):
tty.msg("No code to be uniquely identified.")
"""BundlePackages don't have a source id."""
return ''

View file

@ -1046,7 +1046,9 @@ def do_fetch(self, mirror_only=False):
raise ValueError("Can only fetch concrete packages.")
if not self.has_code:
raise InvalidPackageOpError("Can only fetch a package with a URL.")
tty.msg(
"No fetch required for %s: package has no code." % self.name
)
start_time = time.time()
checksum = spack.config.get('config:checksum')

View file

@ -9,8 +9,7 @@
from llnl.util.filesystem import mkdirp, touch, working_dir
from spack.package import \
InstallError, InvalidPackageOpError, PackageBase, PackageStillNeededError
from spack.package import InstallError, PackageBase, PackageStillNeededError
import spack.patch
import spack.repo
import spack.store
@ -327,7 +326,9 @@ def test_uninstall_by_spec_errors(mutable_database):
PackageBase.uninstall_by_spec(rec.spec)
def test_nosource_pkg_install(install_mockery, mock_fetch, mock_packages):
@pytest.mark.disable_clean_stage_check
def test_nosource_pkg_install(
install_mockery, mock_fetch, mock_packages, capfd):
"""Test install phases with the nosource package."""
spec = Spec('nosource').concretized()
pkg = spec.package
@ -336,9 +337,8 @@ def test_nosource_pkg_install(install_mockery, mock_fetch, mock_packages):
pkg.do_install()
# Also make sure an error is raised if `do_fetch` is called.
with pytest.raises(InvalidPackageOpError,
match="fetch a package with a URL"):
pkg.do_fetch()
pkg.do_fetch()
assert "No fetch required for nosource" in capfd.readouterr()[0]
def test_nosource_pkg_install_post_install(