diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 53b8516..3282a6b 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -1282,11 +1282,11 @@ } } - Dependency dep; + VersionRange dep; if (packageParts.version_.length > 0) { // the user provided a version manually - dep = Dependency(packageParts.version_); + dep = VersionRange.fromString(packageParts.version_); } else { if (packageParts.name.startsWith(":") || dub.packageManager.getFirstPackage(packageParts.name)) @@ -1313,7 +1313,7 @@ const answer = m_yes ? true : input("Do you want to fetch '%s' now?".format(packageParts.name)); if (!answer) return 0; - dep = Dependency(p.version_); + dep = VersionRange.fromString(p.version_); } dub.fetch(packageParts.name, dep, dub.defaultPlacementLocation, FetchOptions.none); @@ -1903,13 +1903,13 @@ if (m_version.length) { // remove then --version removed enforceUsage(!name.canFindVersionSplitter, "Double version spec not allowed."); logWarn("The '--version' parameter was deprecated, use %s@%s. Please update your scripts.", name, m_version); - dub.fetch(name, Dependency(m_version), location, fetchOpts); + dub.fetch(name, VersionRange.fromString(m_version), location, fetchOpts); } else if (name.canFindVersionSplitter) { const parts = name.splitPackageName; - dub.fetch(parts.name, Dependency(parts.version_), location, fetchOpts); + dub.fetch(parts.name, VersionRange.fromString(parts.version_), location, fetchOpts); } else { try { - dub.fetch(name, Dependency.any, location, fetchOpts); + dub.fetch(name, VersionRange.Any, location, fetchOpts); logInfo("Finished", Color.green, "%s fetched", name.color(Mode.bold)); logInfo( "Please note that you need to use `dub run ` " ~ @@ -1919,7 +1919,7 @@ catch(Exception e){ logInfo("Getting a release version failed: %s", e.msg); logInfo("Retry with ~master..."); - dub.fetch(name, Dependency("~master"), location, fetchOpts); + dub.fetch(name, VersionRange.fromString("~master"), location, fetchOpts); } } return 0; diff --git a/source/dub/dub.d b/source/dub/dub.d index 59e4b36..c91e990 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -586,7 +586,7 @@ FetchOptions fetchOpts; fetchOpts |= (options & UpgradeOptions.preRelease) != 0 ? FetchOptions.usePrerelease : FetchOptions.none; - if (!pack) fetch(p, ver, defaultPlacementLocation, fetchOpts, "getting selected version"); + if (!pack) fetch(p, ver.version_, defaultPlacementLocation, fetchOpts, "getting selected version"); if ((options & UpgradeOptions.select) && p != m_project.rootPackage.name) { if (!ver.repository.empty) { m_project.selections.selectVersion(p, ver.repository); @@ -664,7 +664,7 @@ if (!tool_pack) tool_pack = m_packageManager.getBestPackage(tool, "~master"); if (!tool_pack) { logInfo("Hint", Color.light_blue, "%s is not present, getting and storing it user wide", tool); - tool_pack = fetch(tool, Dependency.any, defaultPlacementLocation, FetchOptions.none); + tool_pack = fetch(tool, VersionRange.Any, defaultPlacementLocation, FetchOptions.none); } auto dscanner_dub = new Dub(null, m_packageSuppliers); @@ -738,14 +738,31 @@ } /// Fetches the package matching the dependency and places it in the specified location. + deprecated("Use the overload that accepts either a `Version` or a `VersionRange` as second argument") Package fetch(string packageId, const Dependency dep, PlacementLocation location, FetchOptions options, string reason = "") { + const vrange = dep.visit!( + (VersionRange range) => range, + (any) => throw new Exception("Cannot call `dub.fetch` with a " ~ typeof(any).stringof ~ " dependency"), + ); + return this.fetch(packageId, vrange, location, options, reason); + } + + /// Ditto + Package fetch(string packageId, in Version vers, PlacementLocation location, FetchOptions options, string reason = "") + { + return this.fetch(packageId, VersionRange(vers, vers), location, options, reason); + } + + /// Ditto + Package fetch(string packageId, in VersionRange range, PlacementLocation location, FetchOptions options, string reason = "") + { auto basePackageName = getBasePackageName(packageId); Json pinfo; PackageSupplier supplier; foreach(ps; m_packageSuppliers){ try { - pinfo = ps.fetchPackageRecipe(basePackageName, dep, (options & FetchOptions.usePrerelease) != 0); + pinfo = ps.fetchPackageRecipe(basePackageName, Dependency(range), (options & FetchOptions.usePrerelease) != 0); if (pinfo.type == Json.Type.null_) continue; supplier = ps; @@ -755,7 +772,7 @@ logDebug("Full error: %s", e.toString().sanitize()); } } - enforce(pinfo.type != Json.Type.undefined, "No package "~packageId~" was found matching the dependency "~dep.toString()); + enforce(pinfo.type != Json.Type.undefined, "No package "~packageId~" was found matching the dependency " ~ range.toString()); string ver = pinfo["version"].get!string; NativePath placement; @@ -813,7 +830,7 @@ import std.zip : ZipException; auto path = getTempFile(basePackageName, ".zip"); - supplier.fetchPackage(path, basePackageName, dep, (options & FetchOptions.usePrerelease) != 0); // Q: continue on fail? + supplier.fetchPackage(path, basePackageName, Dependency(range), (options & FetchOptions.usePrerelease) != 0); // Q: continue on fail? scope(exit) std.file.remove(path.toNativeString()); logDiagnostic("Placing to %s...", placement.toNativeString()); @@ -1142,7 +1159,7 @@ if (!template_pack) template_pack = m_packageManager.getBestPackage(packageName, "~master"); if (!template_pack) { logInfo("%s is not present, getting and storing it user wide", packageName); - template_pack = fetch(packageName, Dependency.any, defaultPlacementLocation, FetchOptions.none); + template_pack = fetch(packageName, VersionRange.Any, defaultPlacementLocation, FetchOptions.none); } Package initSubPackage = m_packageManager.getSubPackage(template_pack, "init-exec", false); @@ -1210,7 +1227,7 @@ if (!tool_pack) tool_pack = m_packageManager.getBestPackage(tool, "~master"); if (!tool_pack) { logInfo("%s is not present, getting and storing it user wide", tool); - tool_pack = fetch(tool, Dependency.any, defaultPlacementLocation, FetchOptions.none); + tool_pack = fetch(tool, VersionRange.Any, defaultPlacementLocation, FetchOptions.none); } auto ddox_dub = new Dub(null, m_packageSuppliers); @@ -1673,11 +1690,12 @@ return null; } } + const vers = dep.version_; if (auto ret = m_dub.m_packageManager.getBestPackage(name, dep)) return ret; - auto key = name ~ ":" ~ dep.version_.toString(); + auto key = name ~ ":" ~ vers.toString(); if (auto ret = key in m_remotePackages) return *ret; @@ -1695,15 +1713,15 @@ m_remotePackages[key] = ret; return ret; } catch (Exception e) { - logDiagnostic("Metadata for %s %s could not be downloaded from %s: %s", name, dep, ps.description, e.msg); + logDiagnostic("Metadata for %s %s could not be downloaded from %s: %s", name, vers, ps.description, e.msg); logDebug("Full error: %s", e.toString().sanitize); } } else { - logDiagnostic("Package %s not found in base package description (%s). Downloading whole package.", name, dep.version_.toString()); + logDiagnostic("Package %s not found in base package description (%s). Downloading whole package.", name, vers.toString()); try { FetchOptions fetchOpts; fetchOpts |= prerelease ? FetchOptions.usePrerelease : FetchOptions.none; - m_dub.fetch(rootpack, dep, m_dub.defaultPlacementLocation, fetchOpts, "need sub package description"); + m_dub.fetch(rootpack, vers, m_dub.defaultPlacementLocation, fetchOpts, "need sub package description"); auto ret = m_dub.m_packageManager.getBestPackage(name, dep); if (!ret) { logWarn("Package %s %s doesn't have a sub package %s", rootpack, dep.version_, name);