From abbc47823d57eb932eb17e563cf117883644878b Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Thu, 16 Apr 2020 21:35:30 -0700 Subject: SourceForge: Mirror Mixin (#16112) * SourceForge: Mirror Mixin Add a mixing class for direct `CNAME`s to sourceforge mirrors. Since the main gateway servers are often down, this could reduce timeouts and fetch errors for sourceforge.net hosted software. * SourceForge: unspectacular mirror replacement add mirrors to all sourceforge packages with trivial download logic. tested fetch of latest version of each of these packages with various mirrors before committing. * SourceForge: xz the author homepage is chronocially overrun and this is the offical upload with many mirrors. --- lib/spack/spack/build_systems/sourceforge.py | 40 ++++++++++++++++++++++++++++ lib/spack/spack/pkgkit.py | 1 + lib/spack/spack/test/build_systems.py | 23 ++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 lib/spack/spack/build_systems/sourceforge.py (limited to 'lib') diff --git a/lib/spack/spack/build_systems/sourceforge.py b/lib/spack/spack/build_systems/sourceforge.py new file mode 100644 index 0000000000..602a099c17 --- /dev/null +++ b/lib/spack/spack/build_systems/sourceforge.py @@ -0,0 +1,40 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import spack.util.url +import spack.package + + +class SourceforgePackage(spack.package.PackageBase): + """Mixin that takes care of setting url and mirrors for Sourceforge + packages.""" + #: Path of the package in a Sourceforge mirror + sourceforge_mirror_path = None + + #: List of Sourceforge mirrors used by Spack + base_mirrors = [ + 'https://prdownloads.sourceforge.net/', + 'https://freefr.dl.sourceforge.net/', + 'https://netcologne.dl.sourceforge.net/', + 'https://pilotfiber.dl.sourceforge.net/', + 'https://downloads.sourceforge.net/', + 'http://kent.dl.sourceforge.net/sourceforge/' + ] + + @property + def urls(self): + self._ensure_sourceforge_mirror_path_is_set_or_raise() + return [ + spack.util.url.join(m, self.sourceforge_mirror_path, + resolve_href=True) + for m in self.base_mirrors + ] + + def _ensure_sourceforge_mirror_path_is_set_or_raise(self): + if self.sourceforge_mirror_path is None: + cls_name = type(self).__name__ + msg = ('{0} must define a `sourceforge_mirror_path` attribute' + ' [none defined]') + raise AttributeError(msg.format(cls_name)) diff --git a/lib/spack/spack/pkgkit.py b/lib/spack/spack/pkgkit.py index 5c9c01ff9f..e657144bb4 100644 --- a/lib/spack/spack/pkgkit.py +++ b/lib/spack/spack/pkgkit.py @@ -31,6 +31,7 @@ from spack.build_systems.intel import IntelPackage from spack.build_systems.meson import MesonPackage from spack.build_systems.sip import SIPPackage from spack.build_systems.gnu import GNUMirrorPackage +from spack.build_systems.sourceforge import SourceforgePackage from spack.build_systems.sourceware import SourcewarePackage from spack.build_systems.xorg import XorgPackage diff --git a/lib/spack/spack/test/build_systems.py b/lib/spack/spack/test/build_systems.py index 295704798f..367faeef66 100644 --- a/lib/spack/spack/test/build_systems.py +++ b/lib/spack/spack/test/build_systems.py @@ -244,6 +244,29 @@ class TestGNUMirrorPackage(object): 'make/make-4.2.1.tar.gz' +@pytest.mark.usefixtures('config', 'mock_packages') +class TestSourceforgePackage(object): + + def test_define(self): + s = Spec('mirror-sourceforge') + s.concretize() + pkg = spack.repo.get(s) + + s = Spec('mirror-sourceforge-broken') + s.concretize() + pkg_broken = spack.repo.get(s) + + cls_name = type(pkg_broken).__name__ + with pytest.raises(AttributeError, + match=r'{0} must define a `sourceforge_mirror_path`' + r' attribute \[none defined\]' + .format(cls_name)): + pkg_broken.urls + + assert pkg.urls[0] == 'https://prdownloads.sourceforge.net/' \ + 'tcl/tcl8.6.5-src.tar.gz' + + @pytest.mark.usefixtures('config', 'mock_packages') class TestSourcewarePackage(object): -- cgit v1.2.3-70-g09d2