diff --git a/source/dub/dub.d b/source/dub/dub.d index bfa5980..73beda4 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -65,7 +65,7 @@ /// The URL to the official package registry. enum defaultRegistryURL = "http://code.dlang.org/"; -enum fallbackRegistryURL = "https://code-mirror.dlang.io/"; +enum fallbackRegistryURLs = ["https://code-mirror.dlang.io/"]; /** Returns a default list of package suppliers. @@ -80,7 +80,7 @@ return [ new FallbackPackageSupplier( new RegistryPackageSupplier(URL(defaultRegistryURL)), - new RegistryPackageSupplier(URL(fallbackRegistryURL)) + fallbackRegistryURLs.map!(x => cast(PackageSupplier) new RegistryPackageSupplier(URL(x))).array ) ]; } diff --git a/source/dub/packagesupplier.d b/source/dub/packagesupplier.d index 449cbd0..6270754 100644 --- a/source/dub/packagesupplier.d +++ b/source/dub/packagesupplier.d @@ -292,17 +292,19 @@ package abstract class AbstractFallbackPackageSupplier : PackageSupplier { - protected PackageSupplier m_default, m_fallback; + protected PackageSupplier m_default; + protected PackageSupplier[] m_fallbacks; - this(PackageSupplier default_, PackageSupplier fallback) + this(PackageSupplier default_, PackageSupplier[] fallbacks) { m_default = default_; - m_fallback = fallback; + m_fallbacks = fallbacks; } override @property string description() { - return format("%s (fallback %s)", m_default.description, m_fallback.description); + import std.algorithm.iteration : map; + return format("%s (fallback %s)", m_default.description, m_fallbacks.map!(x => x.description)); } // Workaround https://issues.dlang.org/show_bug.cgi?id=2525 @@ -322,7 +324,18 @@ private template fallback(T, alias func) { enum fallback = q{ - scope (failure) return m_fallback.%1$s(args); + import std.range : back, dropBackOne; + scope (failure) + { + foreach (m_fallback; m_fallbacks.dropBackOne) + { + try + return m_fallback.%1$s(args); + catch(Throwable) + assert(1); + } + return m_fallbacks.back.%1$s(args); + } return m_default.%1$s(args); }.format(__traits(identifier, func)); }